以分块形式组合Numpy数组

5
我有三个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代表具有相关维度的零矩阵。

2
http://docs.scipy.org/doc/numpy/reference/generated/numpy.bmat.html - ford prefect
TIL:np.matrix的字符串语法(但不适用于np.array)。 - Josh.F
2个回答

8
创建块矩阵的简单方法是使用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.]])

另一种(在我看来更为复杂)的方法是使用numpy.hstacknumpy.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.]])

谢谢,可以了;下次会更好地阅读文档的。 - Unitarihedron
4
注意,这将返回一个 np.matrix 而不是 np.array - Eric

0

我生成和连接块状矩阵的方法:

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

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