我有一个 3D 矩阵 X
,其中包含向量作为第 3 维的行。我想提取每个这样的向量 X(:, x, y)
并将其保存为二维矩阵,这样 X(:, 0, 0)
是第一个二维矩阵的行,X(:, 0, 1)
第二行,依此类推。以下粗略的图形可能有助于说明这一点:
我知道我可以创建新的 2D 矩阵,然后遍历原始 X
以添加向量,但是有人对如何快速有效地执行此操作有一些意见吗?
例子:给定
>>> a = np.arange(9*3).reshape(3,3,3)
>>> a
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]],
[[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]],
[[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]])
我想获取以下行,但行的顺序无关紧要:
array([[ 0, 9, 18],
[ 1, 10, 19]],
...)
最佳答案
使用np.transpose
然后 reshape
像这样 -
X.transpose(1,2,0).reshape(-1,X.shape[0])
解释-
1) 你想要得到由 X[:, 0, 0]
, X[:, 0, 1]
等组成的行,即我们必须将 axis=0
元素“推”到此类二维数组输出的最后一个轴。接下来,我们必须确定行的顺序,这将由 axes=1,2
组成。现在,回到所需的二维数组输出,在第一行和第二行之间,即在 X[:, 0, 0]
和 X[:, 0, 1]
之间>, axis=1
保持不变。因此,在二维数组输出中,第二个轴 (axis=1) 将优先于第三个轴 (axis=2)。因此,在 X
中,我们将 axis=1
推到 axis=0
并将 axis=2
推到 axis =1
。因为,如前所述,X
中的 axis=0
必须移动到最后一个轴,所以那将是 axis=2
。所有这些都可以用 X.transpose(1,2,0)
来完成。我们称它为 Y
。
2) 最后,我们必须将 Y
reshape 为 2D
数组,使每行中的元素数与 X.shape[0 ]
,这是通过Y.reshape(-1,X.shape[0])
实现的。于是,最终的解决方案就变成了——
X.transpose(1,2,0).reshape(-1,X.shape[0])
sample 运行-
In [25]: X
Out[25]:
array([[[ 0.19508052, 0.02481975],
[ 0.88915956, 0.95974095]],
[[ 0.23271151, 0.14730822],
[ 0.56763563, 0.30607283]],
[[ 0.33259228, 0.42552102],
[ 0.28950926, 0.47782175]]])
In [26]: X[:, 0, 0]
Out[26]: array([ 0.19508052, 0.23271151, 0.33259228])
In [27]: X[:, 0, 1]
Out[27]: array([ 0.02481975, 0.14730822, 0.42552102])
In [28]: X[:, 1, 0]
Out[28]: array([ 0.88915956, 0.56763563, 0.28950926])
In [29]: X[:, 1, 1]
Out[29]: array([ 0.95974095, 0.30607283, 0.47782175])
In [30]: X.transpose(1,2,0).reshape(-1,X.shape[0])
Out[30]:
array([[ 0.19508052, 0.23271151, 0.33259228],
[ 0.02481975, 0.14730822, 0.42552102],
[ 0.88915956, 0.56763563, 0.28950926],
[ 0.95974095, 0.30607283, 0.47782175]])
关于python - 将 3D 矩阵转换/整形为 2D 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35992458/