uzu*_*aki 3 python arrays numpy python-3.x structured-array
假设我有以下数组:
arr = np.array([[1,2], [3,4]], dtype='u1')
Run Code Online (Sandbox Code Playgroud)
我想把它转换成这样的结构化数组:
strarr = np.array([(1,2), (3,4)], dtype=[('a', 'u1'), ('b', 'u1')])
Run Code Online (Sandbox Code Playgroud)
如果我只是尝试
arr.astype([('a', 'u1'), ('b', 'u1')])
Run Code Online (Sandbox Code Playgroud)
它返回
>>> array([[(1, 1), (2, 2)],
[(3, 3), (4, 4)]], dtype=[('a', 'u1'), ('b', 'u1')])
Run Code Online (Sandbox Code Playgroud)
如何转换数组以便它使用一行的所有元素来填充字段(前提是数字匹配)而不是复制每个元素?
为此有特殊的帮助函数:
>>> from numpy.lib.recfunctions import unstructured_to_structured
Run Code Online (Sandbox Code Playgroud)
所以,
>>> 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')])
Run Code Online (Sandbox Code Playgroud)
您还可以创建视图:
>>> arr.ravel().view(dtype=np.dtype([('a', 'u1'), ('b', 'u1')]))
array([(1, 2), (3, 4)], dtype=[('a', 'u1'), ('b', 'u1')])
Run Code Online (Sandbox Code Playgroud)
在这种简单的情况下,这很好,但是如果您选择使用视图,有时您必须担心数组是如何打包的。请注意,视图不会复制底层缓冲区!如果您使用大型阵列,这可以使其效率更高。