0

事情的后续问题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的的矢量化功能,itertools,地图(),等...但我怎么会去把结果返回到原来的阵列?

或正在使用中间阵列覆盖去原来的唯一途径之前将结果储存?

+1

moveParticles如何被调用? – Sinkingpoint 2013-03-18 07:51:15

+0

请提供要求的输出。 – root 2013-03-18 07:52:14

+1

因为你在你的数据,不同长度的名单什么'np.array'回报是D型'object'和'粒子[:,0]','粒子[:, 1]'和'粒子[:, 2]'是Python列表,而不是数组。因此,当您尝试将速度列表与“dt”浮点数相乘时会出现错误。你应该尝试在数组中存储同类数据。我喜欢下面的Balint's sanswer! – Jaime 2013-03-18 14:06:09

回答

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 

这将使就地更换poslastpos为了移动你的粒子,你就必须要调用的函数为:

moveParticles(pos, lastpos, velocity, 1) 

在哪里设置DT = 1。我还假设,你想拥有浮点坐标,如果没有,你应该产生整数数组来代替。

+0

这看起来像一个非常好的解决方案。这意味着如果我销毁一个粒子,而不是仅仅删除一个元素,我将不得不从多个数组中删除相同的元素。谢谢! – mooglinux 2013-03-18 14:56:06