我有三个 Numpy 矩阵
a = np.matrix('1 2; 3 4')
b = np.matrix('5 6 7; 8 9 10')
c = np.matrix('1 2 3; 4 5 6; 7 8 9')
我想制作以下块矩阵:
M = [a b ; 0 c]
,
其中0
代表具有相关维度的零矩阵。
创建块矩阵的一种简单方法是numpy.bmat
(正如@inquisitiveIdiot 所指出的)。根据您要创建的块矩阵判断,您需要一个 3x2 零矩阵:
>>> import numpy as np
>>> z = np.zeros( (3, 2) )
然后,您可以通过将块的 2x2 数组传递给来创建块矩阵numpy.bmat
:
>>> M = np.bmat( [[a, b], [z, c]] )
>>> M
matrix([[ 1., 2., 5., 6., 7.],
[ 3., 4., 8., 9., 10.],
[ 0., 0., 1., 2., 3.],
[ 0., 0., 4., 5., 6.],
[ 0., 0., 7., 8., 9.]])
另一种(IMO 更复杂)方法是使用numpy.hstack
and numpy.vstack
。
>>> M = np.vstack( (np.hstack((a, b)), np.hstack((z, c))) )
>>> M
matrix([[ 1., 2., 5., 6., 7.],
[ 3., 4., 8., 9., 10.],
[ 0., 0., 1., 2., 3.],
[ 0., 0., 4., 5., 6.],
[ 0., 0., 7., 8., 9.]])
我生成和加入块状矩阵的方法:
def blockwise(matrix, block=(3, 3)):
shape = (int(matrix.shape[0] / block[0]), int(matrix.shape[1] / block[1])) + block
strides = (matrix.strides[0] * block[0], matrix.strides[1] * block[1]) + matrix.strides
return as_strided(matrix, shape=shape, strides=strides)
def block_join(blocks):
return np.vstack(map(np.hstack, blocks))
arr = np.arange(36).reshape((6, 6))
blocks = blockwise(arr, (3, 3))
print(blocks)
re_join = block_join(blocks)
print(re_join)
那么输出如下:
>>>>[[[[ 0 1 2]
[ 6 7 8]
[12 13 14]]
[[ 3 4 5]
[ 9 10 11]
[15 16 17]]]
[[[18 19 20]
[24 25 26]
[30 31 32]]
[[21 22 23]
[27 28 29]
[33 34 35]]]]
[[ 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 27 28 29]
[30 31 32 33 34 35]]