假设我有以下数组:
arr = np.array([[1,2], [3,4]], dtype='u1')
,我想将其转换为这样的结构化数组:
strarr = np.array([(1,2), (3,4)], dtype=[('a', 'u1'), ('b', 'u1')])
如果我只是尝试
arr.astype([('a', 'u1'), ('b', 'u1')])
它返回
>>> array([[(1, 1), (2, 2)],
[(3, 3), (4, 4)]], dtype=[('a', 'u1'), ('b', 'u1')])
如何转换数组,以便使用行的所有元素填充字段(假设数字匹配),而不是复制每个元素?
答案 0 :(得分:4)
有一些特殊的辅助功能:
>>> from numpy.lib.recfunctions import unstructured_to_structured
所以
>>> import numpy as np
>>> arr = np.array([[1,2], [3,4]], dtype='u1')
>>> unstructured_to_structured(arr, dtype=np.dtype([('a', 'u1'), ('b', 'u1')]))
array([(1, 2), (3, 4)], dtype=[('a', 'u1'), ('b', 'u1')])
您还可以创建视图:
>>> arr.ravel().view(dtype=np.dtype([('a', 'u1'), ('b', 'u1')]))
array([(1, 2), (3, 4)], dtype=[('a', 'u1'), ('b', 'u1')])
在这种简单的情况下,这很好,但是如果您选择使用视图,则有时必须担心数组的打包方式。注意,视图不会复制基础缓冲区!如果您使用大型阵列,这可以使其效率更高。
答案 1 :(得分:2)
结构化数组的数据应该是元组列表:
In [5]: arr = np.array([[1,2], [3,4]], dtype='u1')
In [6]: alist = [tuple(i) for i in arr]
In [7]: alist
Out[7]: [(1, 2), (3, 4)]
In [9]: np.array(alist, dtype=[('a', 'u1'), ('b', 'u1')])
Out[9]: array([(1, 2), (3, 4)], dtype=[('a', 'u1'), ('b', 'u1')])
请注意,输入会反映输出显示。
在这种情况下,也可以使用视图(基础数据没有变化):
In [10]: arr.view(dtype=[('a', 'u1'), ('b', 'u1')])
Out[10]:
array([[(1, 2)],
[(3, 4)]], dtype=[('a', 'u1'), ('b', 'u1')])
In [11]: _.ravel() # but needs a shape correction
Out[11]: array([(1, 2), (3, 4)], dtype=[('a', 'u1'), ('b', 'u1')])