如何将多维数组从特定排列重塑为另一排列?

时间:2019-07-31 01:03:41

标签: python arrays numpy tensor

我有一个before_arr(2 x 3 x 4)多维数组。我想将其转换为具有以下特定排列方式的new_arr(3 x 2 x 4)。

import numpy as np

before_arr = np.array([
    [
     [0, 0, 0, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0],
     ],
    [
     [1, 1, 1, 1],
     [1, 1, 1, 1],
     [1, 1, 1, 1],
     ],
    ], dtype=float)

# what I want
new_arr = np.array([
    [
     [0, 0, 0, 0],
     [1, 1, 1, 1],
     ],
    [
     [0, 0, 0, 0],
     [1, 1, 1, 1],
     ],
    [
     [0, 0, 0, 0],
     [1, 1, 1, 1],
     ],
    ], dtype=float)

before_arr.reshape(3, 2, 4)没有给我我想要的东西。

In [74]: before_arr.reshape(3, 2, 4)
Out[74]:
array([[[0., 0., 0., 0.],
        [0., 0., 0., 0.]],

       [[0., 0., 0., 0.],
        [1., 1., 1., 1.]],

       [[1., 1., 1., 1.],
        [1., 1., 1., 1.]]])

2 个答案:

答案 0 :(得分:2)

使用zip来匹配相应的行。

尝试一下:

{ messageType: 'error', message: undefined }

输出:

import numpy as np

before_arr = np.array([
    [
     [0, 0, 0, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0],
     ],
    [
     [1, 1, 1, 1],
     [1, 1, 1, 1],
     [1, 1, 1, 1],
     ],
    ], dtype=float)

new_arr = np.array([*zip(*before_arr)])
print(new_arr)

答案 1 :(得分:1)

由于只需要交换两个轴的位置,因此可以使用np.swapaxes。这可能是获得所需输出的最直接方法。

before_arr.swapaxes(0, 1)

array([[[0., 0., 0., 0.],
        [1., 1., 1., 1.]],

       [[0., 0., 0., 0.],
        [1., 1., 1., 1.]],

       [[0., 0., 0., 0.],
        [1., 1., 1., 1.]]])

从更一般的意义上讲,您可以使用transpose显式定义所需输出的轴顺序,如果您需要移动多个轴(尽管此处并非严格要求),则这将是有益的。

before_arr.transpose(1, 0, 2)