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

时间:2016-03-14 16:06:15

标签: python numpy matrix

我有一个3D矩阵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 个答案:

答案 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=0X必须移动到最后一个轴,所以这将是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])