2016-12-16 5 views
0

У меня есть следующая программаДать три для петель в одну линию (питон)

import numpy as np 

X = np.asarray([ [2,3,4,5,1,1,1], 
    [1,2,3,4,1,1,1], 
    [3,3,3,3,1,1,1]]) 

Nrows=X.shape[0] 
Ncols1=X.shape[1] 

cols=np.asarray([[1,3]]) 
Ncols2=cols.shape[1] 

Y = np.ndarray(shape=(Nrows,Ncols2)) 

for i in range(Nrows): 
    for j in range(Ncols2): 
     sum=0 
     for k in range(Ncols1): 
      sum=sum+np.exp(-(X[i,k]-X[i,cols[0,j])**2) 
     Y[i,j]=sum 

Я хочу, чтобы уменьшить три петли в одну линию. Мотивация здесь частично для ускорения рассмотрения и частично для практических навыков питона.

Так что я могу превратить его в две петли, записывая его как:

for i in range(Nrows): 
    for j in range(Ncols1): 
     Y[i,j]=np.sum(np.exp(-(X[i,]-X[i,cols[0,j]])**2)) 

И я могу превратить его в одну петлю, написав его как:

for i in range(Nrows): 
    Y[i,]=map(lambda j: np.sum(np.exp(-(X[i,]-X[i,cols[0,j]])**2)),range(Ncols2)) 

Но я не могу понять, как превратить это в одну строку. Мой инстинкт попробовать

Y[:,]=map(lambda j: np.sum(np.exp(-(X[:,]-X[:,cols[0,j]])**2)),range(Ncols2)) 

Но это терпит неудачу с «ValueError: операнды не могут передаваться вместе с формами (3,7) (3,)»

Любая помощь будет очень высоко ценится.

-Nick

+5

Я не уверен, будет ли конденсировать ваши петли в одну линию, будет более эффективной или нет. Но я уверен, что у вас будет очень запутанный беспорядок. –

+2

Я согласен с тем, что сказал @leaf – alfasin

+1

Не пишите коды, которые вы не можете понять. что микрооптимизация не поможет. плохая практика –

ответ

1
Y=np.asarray([np.sum(np.exp(-(X[i,]-X[i, cols[0,j]])**2)) for i in range(Nrows) for j in range(Ncols2)]).reshape((Nrows,Ncols2)) 

>>> Y 
array([[ 1.80902144, 1.38631883], 
     [ 2.85771284, 1.38668872], 
     [ 4.05494692, 4.05494692]]) 

Это использует list comp, которые в значительной степени только ваше для петель на одной линии.

[np.sum(np.exp(-(X[i,]-X[i, cols[0,j]])**2)) for i in range(Nrows) for j in range(Ncols2)] 

который является своим родом конгруэнтен это:

Y=[] 
for i in range(Nrows): 
    for j in range(Ncols2): 
    Y.append(#your big formula that uses i and j as arguments) 

с момента своего списка, вы должны создать массив из него и изменить его по своему вкусу, следовательно, np.asarray перед списком компа, и .reshape после

никогда не получалось играть с numpy слишком много ... мне это нравится!

+0

спасибо за редактирование Тадх! В следующий раз я буду профессиональнее – appills

 Смежные вопросы

  • Нет связанных вопросов^_^