1

我正在尝试以一种很好的有序方式对数组中的对象进行分组。现在我尝试了以下方法,但它给了我一个错误。

有小费吗?

#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:使用序列设置数组元素。

4

2 回答 2

3

你可以使用dtype=object,然后存储任何你想要的东西——浮点数、元组、列表、数组。但实际上,这不是一个好主意。你几乎失去了 numpy 的所有好处。

而且,因为这是一个坏主意,numpy 对你来说并不容易。如果你从一个列表中构造一个数组,它假定任何子列表都是数组的维度,如果它不能以这种方式理解事物,它会给你这个错误。

为什么不将实体存储为扁平的数字行?您已经必须将行解释为更高级别的主体,实际上,还有x, y = bodies[1][1]什么比 更好x, y = bodies[1][1:3]

如果你真的想要,你可以创建一个多维数组,但是……为什么?

您可能还想考虑使用 pandas 而不是 raw numpy,或者使用数据库而不是首先使用 numpy,或者只是将每个对象保留body为 Python 对象(无论是否将它们粘贴在 numpy 数组中),或者其他完全. 在不知道您要完成什么的情况下,很难确定什么适合您的需求。但是,您尝试做的事情不太可能是正确的事情。

于 2013-05-24T21:32:11.643 回答
2

可以使用复杂的 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 pdistcdist为此。请注意,这些函数期望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. 那是您的眼睛必须解析的一组括号。

于 2013-05-24T21:41:17.247 回答