使用numpy创建块矩阵的更好方法是什么?

9
考虑这段代码:
M=5;N=3;
A11=np.random.rand(M,M);
A12=np.random.rand(M,N);
A21=np.random.rand(N,M);
A22=np.random.rand(N,N);

我是numpy的新手,正在学习它。我想按照以下方式创建一个块矩阵。

RowBlock1=np.concatenate((A11,A12),axis=1)
RowBlock2=np.concatenate((A21,A22),axis=1)
Block=np.concatenate((RowBlock1,RowBlock2),axis=0)

有更简单的方法吗?例如,在matlab中,我会这样做:

Block=[[A11,A12];[A21,A22]]

并且将通过它完成。我明白这仅适用于数组。

1个回答

15

从NumPy 1.13版本开始,有一个名为numpy.block的函数:

Block = numpy.block([[A11, A12], [A21, A22]])

对于旧版本,可以使用 bmat

Block = numpy.bmat([[A11, A12], [A21, A22]])

numpy.bmat 创建的是矩阵,而不是数组。这通常是不好的。如果你想要一个数组,可以在结果上调用asarray,或者使用A属性

Block = numpy.bmat([[A11, A12], [A21, A22]]).A

bmat还会对堆栈帧进行一些操作,以便您可以执行以下操作:

Block = numpy.bmat('A11,A12; A21,A22')

如果您想使用稀疏矩阵,即A11,...,A22scipy.sparse.csr_matrix类型,则可以使用scipy.sparse.bmat([[A11,A12],[A21,A22]])或选择性地将Aii替换为None,以使该部分为零。 - jjjjjj

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