将numpy数组转换为结构化数组

时间:2020-09-24 17:29:04

标签: python arrays python-3.x numpy structured-array

假设我有以下数组:

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')])

如何转换数组,以便使用行的所有元素填充字段(假设数字匹配),而不是复制每个元素?

2 个答案:

答案 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')])
相关问题