我有一个3D矩阵X
,其中包含向量作为第三维的行。我想提取每个这样的向量X(:, x, y)
并将其保存为2D矩阵,使得X(:, 0, 0)
是2D矩阵的第一行,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]],
...)
答案 0 :(得分:1)
使用np.transpose
,然后使用reshape
,就像这样 -
X.transpose(1,2,0).reshape(-1,X.shape[0])
说明 -
1)您希望从X[:, 0, 0]
,X[:, 0, 1]
等处形成行,即我们必须将axis=0
元素“推”到这样的2D的最后一个轴数组输出。接下来,我们必须确定行的顺序,这些行将由axes=1,2
形成。现在,返回到第一行和第二行之间的所需2D阵列输出,即在X[:, 0, 0]
和X[:, 0, 1]
之间,axis=1
保持不变。因此,在2D阵列输出中,第二轴(轴= 1)优先于第三轴(轴= 2)。因此,在X
中,我们将axis=1
推送到axis=0
,将axis=2
推送到axis=1
。因为,如前所述,axis=0
中X
必须移动到最后一个轴,所以这将是axis=2
。所有这些都可以通过X.transpose(1,2,0)
来完成。我们称之为Y
。
2)最后,我们必须将Y
重新整形为2D
数组,以使每行中的元素数与X.shape[0]
相同,这是通过{{1}实现的}。因此,最终解决方案变为 -
Y.reshape(-1,X.shape[0])
示例运行 -
X.transpose(1,2,0).reshape(-1,X.shape[0])