Python:重塑数组数组
Python: Reshaping array of arrays
是否可以像这样重塑数组数组:
np.array([[1,1,1,1,1,1],
[1,0,0,0,0,1],
[1,0,1,1,0,1]])
分成多个 3x2 数组,如下所示:
np.array([
[[1,1],[1,0],[1,0]],
[[1,1],[0,0],[1,1]],
[[1,1],[0,1],[0,1]]])
提前致谢!
numpy
有能力 reshape()
.
In [29]: a=np.array([[1,1,1,1,1,1],
...: [1,0,0,0,0,1],
...: [1,0,1,1,0,1]])
In [30]: a.reshape((3,3,2))
Out[30]:
array([[[1, 1],
[1, 1],
[1, 1]],
[[1, 0],
[0, 0],
[0, 1]],
[[1, 0],
[1, 1],
[0, 1]]])
不过,这只是改变了看法。如果需要,您可以重新分配 a = a.reshape((3,3,2))
要获得您正在寻找的特定输出,您需要重塑和转置特定列(通过传入要转置的列)。
首先你需要重塑以获得你想要的分组。使用 -1
就像一个通配符,它将使中间值成为正确填充形状所需的任何值。
使用 arr.reshape(3,-1, 2)
进行重塑可以得到:
array([[[1, 1],[1, 1],[1, 1]],
[[1, 0],[0, 0],[0, 1]],
[[1, 0],[1, 1],[0, 1]]])
组是正确的,但希望将列分组为行。这就是 transpose
的用途。在这种情况下,您想交换第一轴和第二轴。
您可以像这样一步完成:
import numpy as np
arr = np.array([
[1,1,1,1,1,1],
[1,0,0,0,0,1],
[1,0,1,1,0,1]])
arr.reshape(3,-1, 2).transpose([1, 0, 2])
输出:
array([[[1, 1], [1, 0], [1, 0]],
[[1, 1], [0, 0], [1, 1]],
[[1, 1], [0, 1], [0, 1]]])
如果可以将一个数组重新整形为另一个数组,最好的回答方法是比较它们的展平形式:
arr = np.array([[1,1,1,1,1,1], [1,0,0,0,0,1], [1,0,1,1,0,1]])
arr2 = np.array([[[1,1],[1,0],[1,0]], [[1,1],[0,0],[1,1]], [[1,1],[0,1],[0,1]]])
>>> print(arr.flatten())
[1 1 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 1]
>>> print(arr2.flatten())
[1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1]
在这种情况下,这是不可能的,因为结果不同。您还需要 swapaxes
:
arr.reshape(3,3,2).swapaxes(0,1)
是否可以像这样重塑数组数组:
np.array([[1,1,1,1,1,1],
[1,0,0,0,0,1],
[1,0,1,1,0,1]])
分成多个 3x2 数组,如下所示:
np.array([
[[1,1],[1,0],[1,0]],
[[1,1],[0,0],[1,1]],
[[1,1],[0,1],[0,1]]])
提前致谢!
numpy
有能力 reshape()
.
In [29]: a=np.array([[1,1,1,1,1,1],
...: [1,0,0,0,0,1],
...: [1,0,1,1,0,1]])
In [30]: a.reshape((3,3,2))
Out[30]:
array([[[1, 1],
[1, 1],
[1, 1]],
[[1, 0],
[0, 0],
[0, 1]],
[[1, 0],
[1, 1],
[0, 1]]])
不过,这只是改变了看法。如果需要,您可以重新分配 a = a.reshape((3,3,2))
要获得您正在寻找的特定输出,您需要重塑和转置特定列(通过传入要转置的列)。
首先你需要重塑以获得你想要的分组。使用 -1
就像一个通配符,它将使中间值成为正确填充形状所需的任何值。
使用 arr.reshape(3,-1, 2)
进行重塑可以得到:
array([[[1, 1],[1, 1],[1, 1]],
[[1, 0],[0, 0],[0, 1]],
[[1, 0],[1, 1],[0, 1]]])
组是正确的,但希望将列分组为行。这就是 transpose
的用途。在这种情况下,您想交换第一轴和第二轴。
您可以像这样一步完成:
import numpy as np
arr = np.array([
[1,1,1,1,1,1],
[1,0,0,0,0,1],
[1,0,1,1,0,1]])
arr.reshape(3,-1, 2).transpose([1, 0, 2])
输出:
array([[[1, 1], [1, 0], [1, 0]],
[[1, 1], [0, 0], [1, 1]],
[[1, 1], [0, 1], [0, 1]]])
如果可以将一个数组重新整形为另一个数组,最好的回答方法是比较它们的展平形式:
arr = np.array([[1,1,1,1,1,1], [1,0,0,0,0,1], [1,0,1,1,0,1]])
arr2 = np.array([[[1,1],[1,0],[1,0]], [[1,1],[0,0],[1,1]], [[1,1],[0,1],[0,1]]])
>>> print(arr.flatten())
[1 1 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 1]
>>> print(arr2.flatten())
[1 1 1 0 1 0 1 1 0 0 1 1 1 1 0 1 0 1]
在这种情况下,这是不可能的,因为结果不同。您还需要 swapaxes
:
arr.reshape(3,3,2).swapaxes(0,1)