Python 如何将数组转换为结构化数组的特殊项并将其还原?

Python 如何将数组转换为结构化数组的特殊项并将其还原?,python,numpy,reshape,array-broadcasting,Python,Numpy,Reshape,Array Broadcasting,我想对结构化数组的项而不是数字执行一些numpy方法。例如,在处理形状(4,3)的整数数组时,我需要将其转换为长度为3的项数组,并执行一些操作,因为它是形状(4,)的单个一维数组。不幸的是,这些转换本身对我来说非常复杂。让我们再举一个例子: n, m, r = 2, 3, 4 array = np.arange(n*m).reshape((n,m)) dt = np.dtype(','.join('i'*m)) arr1 = np.array([tuple(x) for x in array],

我想对结构化数组的项而不是数字执行一些numpy方法。例如,在处理形状(4,3)的整数数组时,我需要将其转换为长度为3的项数组,并执行一些操作,因为它是形状(4,)的单个一维数组。不幸的是,这些转换本身对我来说非常复杂。让我们再举一个例子:

n, m, r = 2, 3, 4
array = np.arange(n*m).reshape((n,m))
dt = np.dtype(','.join('i'*m))
arr1 = np.array([tuple(x) for x in array], dtype=dt)
>>> arr1
array([(0, 1, 2), (3, 4, 5)],
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])
我想将其转换为此数组:

array([[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]],
       [[3, 4, 5], [3, 4, 5], [3, 4, 5], [3, 4, 5]]]
我有两个问题:

  • 如何将
    array
    转换为
    arr1
    (一组特殊项),而无需迭代
  • 如何将
    arr2
    (一组特殊项目)转换回我想要的单个项目数组

  • numpy
    提供了一个帮助器函数来执行此操作:

    >>> n, m, r = 2, 3, 4
    >>> array = np.arange(n*m).reshape((n,m))
    >>> import numpy.lib.recfunctions as recfunctions
    >>> recfunctions.unstructured_to_structured(array, dtype=np.dtype(','.join('i'*m)))
    array([(0, 1, 2), (3, 4, 5)],
          dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])
    
    在这种特殊情况下,如果原始数组是
    dtype=np.int32
    ,则可以使用以下视图:

    >>> array = np.arange(n*m, dtype=np.int32).reshape((n,m))
    >>> structured_view = array.view(dtype=np.dtype(','.join('i'*m)))
    >>> structured_view
    array([[(0, 1, 2)],
           [(3, 4, 5)]], dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])
    

    使用视图可能会变得棘手、快速。

    “我想对元组而不是数字执行一些numpy方法。”这绝对不是您要做的。您正在使用结构化数组。这不是一个“元组数组而不是数字”@juanpa.arrivillaga好吧,我会解决它。这是有误导性的。@mathfux您也可以使用
    numpy.view
    ,但这有一堆地雷,您必须注意包装等。它适用于最简单的情况,就像您在这里遇到的情况一样,但是,如果您的原始
    array
    的dtype=np.int32,它是有意义的。但是,我对
    numpy.view
    s没有经验,所以这是一个很好的机会,可以用第二种方法来解决它(可能对任何其他人都是如此)。@mathfux ok,添加了一些例子
    >>> import numpy.lib.recfunctions as recfunctions
    >>> recfunctions.structured_to_unstructured(arr2)
    array([[[0, 1, 2],
            [0, 1, 2],
            [0, 1, 2],
            [0, 1, 2]],
    
           [[3, 4, 5],
            [3, 4, 5],
            [3, 4, 5],
            [3, 4, 5]]], dtype=int32)
    
    >>> array = np.arange(n*m, dtype=np.int32).reshape((n,m))
    >>> structured_view = array.view(dtype=np.dtype(','.join('i'*m)))
    >>> structured_view
    array([[(0, 1, 2)],
           [(3, 4, 5)]], dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4')])
    
    >>> arr2.view(dtype=np.int32)
    array([[0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2],
           [3, 4, 5, 3, 4, 5, 3, 4, 5, 3, 4, 5]], dtype=int32)