将 numpy Void 数组转换为记录数组?
Converting numpy Void array to record array?
我有一个 numpy 数组,其中包含 8 个 16 字节长的无效记录,如下所示:
array([[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]],
dtype='|V16')
并且需要将其转换为一个包含 8 个 16B 长的自定义数据类型记录的数组,如下所示:
[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')]
我怎样才能做到这一点?
我试过了array.astype(self.dtype, copy=False, casting="unsafe")
,
但我得到
ValueError: setting an array element with a sequence.
这对我来说意义不大。
此数据来自 PyOpenCL(内存映射缓冲区),我无法真正更改输入格式或数据类型。
只要字节数匹配,view
就可以进行这种变换。它只是改变了数据缓冲区的方式 'viewed'.
In [36]: dt=np.dtype([(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')])
In [37]: dt
Out[37]: dtype([(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')])
In [39]: x = np.zeros((3,), dtype=dt)
In [40]: x
Out[40]:
array([(0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)],
dtype=[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')])
In [41]: x.view('|V16')
Out[41]:
array([[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]],
dtype='|V16')
In [42]: x.view('|V16').view(dt)
Out[42]:
array([(0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)],
dtype=[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')])
我经常需要通过实验来确定 astype
或 view
是转换结构化数组的正确方法。
我有一个 numpy 数组,其中包含 8 个 16 字节长的无效记录,如下所示:
array([[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]],
dtype='|V16')
并且需要将其转换为一个包含 8 个 16B 长的自定义数据类型记录的数组,如下所示:
[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')]
我怎样才能做到这一点?
我试过了array.astype(self.dtype, copy=False, casting="unsafe")
,
但我得到
ValueError: setting an array element with a sequence.
这对我来说意义不大。
此数据来自 PyOpenCL(内存映射缓冲区),我无法真正更改输入格式或数据类型。
只要字节数匹配,view
就可以进行这种变换。它只是改变了数据缓冲区的方式 'viewed'.
In [36]: dt=np.dtype([(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')])
In [37]: dt
Out[37]: dtype([(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')])
In [39]: x = np.zeros((3,), dtype=dt)
In [40]: x
Out[40]:
array([(0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)],
dtype=[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')])
In [41]: x.view('|V16')
Out[41]:
array([[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0],
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]],
dtype='|V16')
In [42]: x.view('|V16').view(dt)
Out[42]:
array([(0, 0, 0, 0), (0, 0, 0, 0), (0, 0, 0, 0)],
dtype=[(('x', 's0'), '<u4'), (('y', 's1'), '<u4'), (('z', 's2'), '<u4'), ('padding0', '<u4')])
我经常需要通过实验来确定 astype
或 view
是转换结构化数组的正确方法。