NumPy вместо цикла for для функции с умножением и сложением - PullRequest
0 голосов
/ 08 февраля 2019

(python 2)

Мой цикл for это

vx2=[]
vy2=[]
vz2=[]

for xn in range(0,npoints-2):
     vx11=vx1[xn]+.5*(fxxx_list[xn]+fxxx_list[xn+1])*dt
     vy11=vy1[xn]+.5*(fxxx_list[xn]+fxxx_list[xn+1])*dt
     vz11=vz1[xn]+.5*(fxxx_list[xn]+fxxx_list[xn+1])*dt 

     vx2.append(vx11)
     vy2.append(vy11)
     vz2.append(vz11) 
     print vx2, vy2, vz2

Мой проф.сказал мне, что я могу ускорить это, заменив циклы for, просто работая с массивами Numpy, но я обнаружил, что умножение нецелых чисел и добавление / умножение в одной и той же функции Numpy было неэффективным.Есть ли элегантный способ написать это, используя Numpy вместо цикла for?

Я уже пробовал это:

#number of iterations
xn=n1[0:998]
array=np.array(xn)


vxn=vx1[0:998]
vyn=vy1[0:998]
vzn=vz1[0:998]


vvv=np.multiply((dt),(fxxx_list))
vx2=vxn+vvv
vy2=vyn+vvv
vz2=vzn+vvv

Но я не мог сделать свой алгоритм совершенно корректным, и, как вы можете видеть, это своего рода беспорядок и занимает столько же времени, сколько и для-loop.

1 Ответ

0 голосов
/ 08 февраля 2019

Попробуйте это:

fxxx_list = np.array(fxxx_list)
vx = np.array([vx1,vy1,vy2])

vx11, vy11, vz11 = vx + (fxxx_list[:-2] + fxxx_list[1:-1])/2  * dt

Если массивы vx1, ... также имеют длину n_точек, чем следует использовать

vx = np.array([vx1,vy1,vy2])[:,:-2]

ПРИМЕЧАНИЕ. Я предполагаю, что vx1, ... все одинаковой длины

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...