我正在尝试以一种很好的有序方式对数组中的对象进行分组。现在我尝试了以下方法,但它给了我一个错误。
有小费吗?
#body: mass, [x,y], [vx,vy], [ax, ay]
bodies = np.array([[1E3, [0,0], [0,0], [0.0]],\
[1, [0,200], [31.6,0], [0,0]]])
ValueError:使用序列设置数组元素。
你可以使用dtype=object
,然后存储任何你想要的东西——浮点数、元组、列表、数组。但实际上,这不是一个好主意。你几乎失去了 numpy 的所有好处。
而且,因为这是一个坏主意,numpy 对你来说并不容易。如果你从一个列表中构造一个数组,它假定任何子列表都是数组的维度,如果它不能以这种方式理解事物,它会给你这个错误。
为什么不将实体存储为扁平的数字行?您已经必须将行解释为更高级别的主体,实际上,还有x, y = bodies[1][1]
什么比 更好x, y = bodies[1][1:3]
?
如果你真的想要,你可以创建一个多维数组,但是……为什么?
您可能还想考虑使用 pandas 而不是 raw numpy,或者使用数据库而不是首先使用 numpy,或者只是将每个对象保留body
为 Python 对象(无论是否将它们粘贴在 numpy 数组中),或者其他完全. 在不知道您要完成什么的情况下,很难确定什么适合您的需求。但是,您尝试做的事情不太可能是正确的事情。
您可以使用复杂的 dtype:
bodies = np.array([(1E3, [0,0], [0,0], [0.0]),
(1, [0,200], [31.6,0], [0,0])],
dtype=[('mass',float), ('xy','2float'),
('vxy','2float'), ('axy','2float')])
并访问“列”
In [63]: bodies['mass']
Out[63]: array([ 1000., 1.])
In [64]: bodies['xy']
Out[64]:
array([[ 0., 0.],
[ 0., 200.]])
等等,但这不会让你的生活更轻松。
我正在制作一个 n 体模拟器
计算对象之间的距离将是n
-body 模拟器中的常见操作。您可能想使用scipy.spatial.distance pdist
或cdist
为此。请注意,这些函数期望X
是简单、同质 dtype 的 NumPy ndarray。因此,如果您要使用复杂 dtype 的数组,则始终必须先对其进行切片,然后才能使用这些函数中的任何一个。
因此,从一开始就存储简单、同质 dtype 的数组并避免复杂 dtype 的数组可能会更简单。
我建议制作多个一维数组:
mass = np.array(...)
x = np.array(...)
y = np.array(...)
或者可能使用一些简单、同质 dtype 的二维数组:
pos = np.array([(x0, y0), (x1, y1), ...], dtype='float')
通过这种方式,您所有的方程式也将更具可读性。而不是使用您访问 2D 位置数组,bodies['xy']
只需编写pos
. 那是您的眼睛必须解析的一组括号。