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

How to reshape a multidimensional array from a particular arrangement to another arrangement?

我有一个 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.]]])

使用zip匹配相应的行。

试试这个:

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)

输出:

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

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

 [[0. 0. 0. 0.]
  [1. 1. 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)