python - 如何使用 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()
解决方案
您的问题是您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
推荐阅读
- html - 外部样式表不影响 HTML
- r - 撇号在 html、notebook 和 Rstudio 中呈现不同
- office-js - Microsoft Office PowerPoint 加载项:Javascript 共享运行时能否支持内容加载项?
- go - 无法将 arg(字符串类型)转换为 Lambo 类型
- amazon-web-services - AWS CLI list-policies 用于查找具有特定名称的策略
- java - 如何检查输入日期(月&日)是否在合理范围内?
- python - 设置时区后 Google Colab 日期错误
- flutter - 在颤动中替换不推荐使用的文本主题
- python - 使用正则表达式按照特定模式提取多个字符串
- intellij-idea - IntelliJ:我如何“踢”错误突出显示过程以使其脱离困境?