如何将多维数组从特定排列重塑为另一种排列?
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)
我有一个 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)