只是为了概括一下这一点,我将在您的数据类型中添加另一个字段
In [234]: dt = numpy.dtype([('position', numpy.int32, 3),('id','U3')])
In [235]: a=np.ones((3,),dtype=dt)
The repr
display 确实使用列表和元组:
In [236]: a
Out[236]:
array([([1, 1, 1], '1'), ([1, 1, 1], '1'), ([1, 1, 1], '1')],
dtype=[('position', '<i4', (3,)), ('id', '<U3')])
但正如你所注意到的,tolist
不扩展元素。
In [237]: a.tolist()
Out[237]: [(array([1, 1, 1]), '1'), (array([1, 1, 1]), '1'),
(array([1, 1, 1]), '1')]
类似地,可以从完全嵌套的列表和元组创建这样的数组。
In [238]: a=np.array([([1,2,3],'str')],dtype=dt)
In [239]: a
Out[239]:
array([([1, 2, 3], 'str')],
dtype=[('position', '<i4', (3,)), ('id', '<U3')])
In [240]: a.tolist()
Out[240]: [(array([1, 2, 3]), 'str')]
从这个不完整的递归中重新创建数组没有问题:
In [250]: np.array(a.tolist(),dtype=dt)
Out[250]:
array([([1, 2, 3], 'str')],
dtype=[('position', '<i4', (3,)), ('id', '<U3')])
这是我第一次看到有人使用tolist
有这样的结构化数组,但我并不太惊讶。我不知道开发者是否会认为这是一个错误。
为什么需要这个数组的纯列表/元组渲染?
我想知道是否有一个功能numpy/lib/recfunctions.py
这解决了这个问题。