如何使用 Numpy 更新初始数组

How to Update Inital Arrays with Numpy

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

我尝试使用

来做到这一点
 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()

如果你不需要所有的 x2, y2, z2, x3, ... 最后在内存中,你可以在最后添加几行

x1 = x2
y1 = y2
z1 = z2

这样,在第二次通过循环时,您将更新 X1、Y1、Z1 值作为输入,您只需将 x2、y2、z2 改写为(人们会考虑的)x3、y3、z3 .这些家伙被加载到 x1、y1、z1 并继续循环。

如果您确实需要所有中间 x、y 和 z 值,可能值得在每个步骤将它们打印到文件中,以便您以后可以访问它们。

您的问题是您在每次迭代中都覆盖了 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



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

上面代码的开头是在每次 for 循环迭代时初始化 M。如果您打算写入 M 作为您的答案以避免这种情况,请将 M 放在 for 循环之外。

考虑使用枚举深入到要计算的位置。我发现它很有用,因为它提供了对您所在索引的访问权限,这有助于计算之前和当前的时间步长。

看到这个堆栈溢出 post:

您将使用的此结构的示例:

npoints = 1000
M = np.zeros((npoints,npoints))

def add_to_number(prev_num):
    new_num = prev_num + 1
    return new_num

for i, row in enumerate(M[0:-1]):
    # this is a row slice of M
    for j, value in enumerate(row[0:-1]):
        # this is a value slice of the above row
        # having position i, j
        M[i+1, j+1] = add_to_number(value)

您会看到它将逐行、逐个值地遍历 M,并沿 M 添加数字。希望对您有所帮助!