my last one关于编写高效python程序的后续问题。我一直在玩写自己的物理模拟,并希望摆脱使用十亿个类和方法。
所以我希望能够对数据集进行计算。这是我最近的尝试:
particles = np.array([ #position, last position, velocity, mass, size
[[200,0],[200,200],[5,5],10,15], \
[[210,210],[210,210],[8,2],20,25],\
[[215,215],[195,195],[5,3],5,15], \
[[192,186],[160,160],[10,-4],30,30]])
def moveParticles(part, dt):
part[0] = part[1]
part[1] += np.multiply(part[2],dt)
我试图将每个粒子的每个属性存储在一个数组中,然后就地更新它们。在这里,我试图将速度向量乘以时间步长,然后将其添加到位置向量。这似乎是向我表达这一点的自然方式,但它给了我错误:
TypeError: can't multiply sequence by non-int of type 'float'
我可以将数据写回同一个数组,我该怎么做呢?
我一直在阅读,并查看numpy的vectorize函数,itertools,map()等等...但是我如何将结果放回原始数组?
或者正在使用中间数组来存储结果,然后才能覆盖原始文件?
答案 0 :(得分:2)
我认为,你只是以错误的方式调用你的例程(可能只传递整个粒子数组而不是只传递一个粒子的数组。
无论如何,在其他可能的解决方案是将数组拆分为单个数组:
import numpy as np
pos = np.array([[200,0], [210,210], [215,215], [192,186]], dtype=float)
lastpos = np.array([[200,2000], [ 210,210], [195, 195], [160,160]], dtype=float)
velocity = np.array([[ 5,5], [8,2], [5,3], [10,-4]], dtype=float)
mass = np.array([ 10, 20, 5, 30 ], dtype=float)
size = np.array([ 15, 25, 15, 30 ], dtype=float)
def moveParticles(pos, lastpos, velocity, dt):
lastpos[:] = pos[:]
pos[:] += velocity * dt
这将替换pos
和lastpos
。为了移动粒子,你必须调用函数:
moveParticles(pos, lastpos, velocity, 1)
我设置dt = 1.我还假设你想要浮点坐标,如果没有,你应该生成整数数组。