首页 > 解决方案 > 如何使用 Numpy 更新初始数组

问题描述

(python 2)我有这段代码,它接受我的数组 x1,y1,z1,vx1,vy1,vz1,并对它们进行操作(这是代码的大部分),最后我留下了新的数组x2,y2,z2,vx2,vy2,vz2。我想要做的是弄清楚如何循环整个代码,但是用 x2,y2,... 更新 x1,y1,...etc 给我 x3,y3.... 等直到我有 xn,yn, ... ETC。

我试图通过使用来做到这一点,

 for timestep in xrange(0,1000):

但这只是运行整个程序 1000 次给我 x2,y2,... 1000 次。此外,它真的很慢。但是,我想做的是得到 x1000,y1000,.... 最好使用 Numpy,这样我的代码也运行得更快。

#x1,y1,z1,vx1,vy1,vz1,mass1,and n1 are all arrays with npoints elements

for timestep in xrange(0,1000):     
     M = np.zeros((npoints,npoints))

     def do_work(xn, step):

         #Not my actual function, but to give you an idea
         M[xn,step] = x1[step]+y1[step]+z1[step]+x1[xn]+y[xn]+z[xn]

     #the rest of this is all just more code to create my new arrays.
     [do_work(xn, step) for (xn,step) in itertools.product(xrange(npoints), xrange(npoints))]



     a=[np.sum(arr) for arr in M]


     a = np.array(a)
     vxx = np.array(vx1)
     vyy=np.array(vy1)
     vzz=np.array(vz1)
     vx=vxx[0:npoints]
     vy=vyy[0:npoints]
     vz=vzz[0:npoints]

     vx2 = vx + (a +a)/2  * dt
     vy2 = vy + (a +a)/2  * dt
     vz2 = vz + (a+a)/2   * dt

     xx = np.array(x1)
     yy = np.array(y1)
     zz = np.array(z1)

     x=xx[0:npoints]
     y=yy[0:npoints]
     z=zz[0:npoints]


     x2= (x+vx2*dt) + (a*dt**2)/2
     y2= (y+vy2*dt) + (a*dt**2)/2
     z2= (z+vz2*dt) + (a*dt**2)/2


#plotting and printing 


#print x1
#plt.scatter(x2,y2)

plt.show()

标签: pythonnumpyfor-looppython-2.x

解决方案


您的问题是您x2, etc在每次迭代中都覆盖了您的。我建议只在循环中计算您的增量并将它们添加到您的x1, etc或在循环之前创建一个副本,x1, etc例如x_final, etc并在循环中累积添加您的增量。

#x1,y1,z1,vx1,vy1,vz1,mass1,and n1 are all arrays with npoints elements

#x_final, y_final as copy

for timestep in xrange(0,1000): 
    # do your calculations

    x_final = x_final + dx




推荐阅读