将3D矩阵转换/重塑为2D矩阵

3
我有一个三维矩阵X,其中包含向量作为第三个维度的行。我想提取每个这样的向量X(:,x,y)并将其保存为2D矩阵,使得X(:,0,0)是2D矩阵的第一行,X(:,0,1)第二行,以此类推。以下简单的图形可能有助于说明:

Crude Sketch

我知道我可以创建新的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]],
       ...)
1个回答

3
使用 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重塑为一个2D数组,使得每行的元素数量与X.shape[0]相同,这可以通过Y.reshape(-1,X.shape[0])实现。因此,最终解决方案变为 -

X.transpose(1,2,0).reshape(-1,X.shape[0])

演示执行 -


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]])

抱歉造成困惑!对于我的应用程序来说,行的顺序并不重要,任何一种都可以。 - fabian789
非常感谢,很有道理! - fabian789
@Divakar 我们如何使X.transpose(1,2,0).reshape(-1,X.shape[0])适用于任何列更大的数组X - wondim
@wondim 这应该适用于任何具有通用列数的数组。 - Divakar
@wondim 如果您能使用 mcve 发布一个新问题,那么这将更有意义。 - Divakar
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接