【问题标题】:Converting numpy array to structured array将numpy数组转换为结构化数组
【发布时间】:2020-09-24 17:29:04
【问题描述】:

假设我有以下数组:

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

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

【问题讨论】:

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


    【解决方案1】:

    为此有特殊的辅助函数:

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

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

    【讨论】:

      【解决方案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')])
      

      【讨论】:

        猜你喜欢
        • 2021-12-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-31
        • 1970-01-01
        • 1970-01-01
        • 2020-06-25
        • 2023-03-18
        • 2010-12-30
        相关资源
        最近更新 更多