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

Converting numpy array to 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')])

它returns

>>> array([[(1, 1), (2, 2)],
       [(3, 3), (4, 4)]], dtype=[('a', 'u1'), ('b', 'u1')])

如何转换数组,使其使用行中的所有元素来填充字段(前提是数字匹配)而不是复制每个元素?

为此有特殊的辅助函数:

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

在这个简单的例子中,这很好,但是如果您选择使用视图,您有时不得不担心数组的打包方式。请注意,视图不会复制底层缓冲区!如果您使用大型数组,这可以使它更有效率。

结构化数组的数据应该是一个元组列表:

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