Numpy将矩阵的层次结构转换为连接

xyhw6mcr  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(105)

我有以下4个矩阵:

>>> a
array([[0., 0.],
       [0., 0.]])
>>> b
array([[1., 1.],
       [1., 1.]])
>>> c
array([[2., 2.],
       [2., 2.]])
>>> d
array([[3., 3.],
       [3., 3.]])

我正在创建另一个矩阵来包含它们:

>>> e = np.array([[a,b], [c,d]])
>>> e.shape
(2, 2, 2, 2)

我想“取消层次结构”,并将e重塑为一个4x4矩阵,如下所示:

0 0 1 1
0 0 1 1
2 2 3 3
2 2 3 3

然而,当我运行e.reshape((4,4))时,我得到以下矩阵:

>>> e.reshape((4,4))
array([[0., 0., 0., 0.],
       [1., 1., 1., 1.],
       [2., 2., 2., 2.],
       [3., 3., 3., 3.]])

有没有一种方法可以通过取消层次结构,而不是通过我当前获得的索引,将(2,2,2,2)矩阵重塑为(4,4)矩阵?

wvyml7n5

wvyml7n51#

尝试

np.block([[a,b],[c,d]])

这将水平连接内部列表,并进行垂直堆栈。
或者,您可以交换e的两个轴,然后重新整形。

In [41]: np.block([[a,b],[c,d]])
Out[41]: 
array([[0., 0., 1., 1.],
       [0., 0., 1., 1.],
       [2., 2., 3., 3.],
       [2., 2., 3., 3.]])

In [45]: e.transpose(0,2,1,3).reshape(4,4)
Out[45]: 
array([[0., 0., 1., 1.],
       [0., 0., 1., 1.],
       [2., 2., 3., 3.],
       [2., 2., 3., 3.]])

block相当于:

In [47]: np.vstack([np.hstack([a,b]),np.hstack([c,d])])
Out[47]: 
array([[0., 0., 1., 1.],
       [0., 0., 1., 1.],
       [2., 2., 3., 3.],
       [2., 2., 3., 3.]])
wmtdaxz3

wmtdaxz32#

是的,你可以用numpy的**.concatenate**函数来实现:

np.concatenate(np.concatenate(e, axis=1), axis=1)

在那里你得到以下矩阵作为结果:

array([[0., 0., 1., 1.],
       [0., 0., 1., 1.],
       [2., 2., 3., 3.],
       [2., 2., 3., 3.]])

相关问题