将numpy数组从3D重塑为2D

时间:2016-12-24 19:18:34

标签: python arrays numpy

我有一个形状为(5,2,1)的数组

array([[[-0.00047776],
    [-0.00065181]],

   [[-0.00065181],
    [ 0.00130446]],

   [[ 0.00130446],
    [ 0.00151989]],

   [[ 0.00151989],
    [ 0.00121407]],

   [[ 0.00121407],
    [-0.00121259]]], dtype=float32)

我想将它转换为像这样的形状(2,5,1)

        array([

                [[-0.00047776], [-0.00065181], [ 0.00130446], [ 0.00151989], [ 0.00121407]], 
                [[-0.00065181], [ 0.00130446], [ 0.00151989], [ 0.00121407], [-0.00121259]]


            ])

由于

1 个答案:

答案 0 :(得分:3)

每个NumPy数组的项目都有一个自然的1D顺序。这是顺序 你看到的时候 ravel 数组。重塑(使用默认顺序='C')不会更改顺序 数组中的项目。因此,x.reshape(shape)与...相同 x.ravel().reshape(shape)。这里的关键外卖消息是一个数组 当且仅当y等于x 时,y.ravel()才能通过重塑x.ravel()来“到达”。

因此,考虑给定数组中项目的raveled(1维)顺序和所需数组:

In [21]: x = np.array([[[-0.00047776], [-0.00065181]], [[-0.00065181], [ 0.00130446]], [[ 0.00130446], [ 0.00151989]], [[ 0.00151989], [ 0.00121407]], [[ 0.00121407], [-0.00121259]]], dtype=np.float32); x.ravel()
Out[21]: 
array([-0.00047776, -0.00065181, -0.00065181,  0.00130446,  0.00130446,
        0.00151989,  0.00151989,  0.00121407,  0.00121407, -0.00121259], dtype=float32)

In [22]: y = np.array([ [[-0.00047776], [-0.00065181], [ 0.00130446], [ 0.00151989], [ 0.00121407]], [[-0.00065181], [ 0.00130446], [ 0.00151989], [ 0.00121407], [-0.00121259]] ]); y.ravel()
Out[22]: 
array([-0.00047776, -0.00065181,  0.00130446,  0.00151989,  0.00121407,
       -0.00065181,  0.00130446,  0.00151989,  0.00121407, -0.00121259])

请注意,商品订单不同。因此,要实现所需的数组,必须首先(以某种方式)重新排序x中的项目。在这种情况下,交换第一轴和第二轴的using swapaxes可以解决问题:

In [23]: x.swapaxes(0,1)
Out[25]: 
array([[[-0.00047776],
        [-0.00065181],
        [ 0.00130446],
        [ 0.00151989],
        [ 0.00121407]],

       [[-0.00065181],
        [ 0.00130446],
        [ 0.00151989],
        [ 0.00121407],
        [-0.00121259]]], dtype=float32)

In [26]: np.allclose(x.swapaxes(0,1), y)
Out[26]: True

由于x.swapaxes(0,1)已经具有形状(2,5,1),因此不需要重新塑形。