如何使用 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 添加数字。希望对您有所帮助!
(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 添加数字。希望对您有所帮助!