我没有看到问题scipy.sparse.block_diag http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.block_diag.html,但我可能不太明白你所说的“覆盖”是什么意思。例如,您在问题中说明的输出可以这样形成:
In [41]: from scipy import sparse
In [42]: a = np.array([[1, 2], [3, 4]])
In [43]: b = np.array([[5, 6], [7, 8]])
In [44]: c = np.array([[9, 10], [11, 12]])
In [45]: m = sparse.block_diag([a, a+b, b+c])
In [46]: m.A
Out[46]:
array([[ 1, 2, 0, 0, 0, 0],
[ 3, 4, 0, 0, 0, 0],
[ 0, 0, 6, 8, 0, 0],
[ 0, 0, 10, 12, 0, 0],
[ 0, 0, 0, 0, 14, 16],
[ 0, 0, 0, 0, 18, 20]])
Edit:浏览了一些有关光束分析的材料后,我想我更好地理解了您想要如何覆盖矩阵。
例如,假设有四个 2x2 数组 a、b、c 和 d。 “覆盖”的示例如下:
a[0,0] a[0,1] 0 0 0
a[1,0] a[1,1]+b[0,0] b[0,1] 0 0
0 b[1,0] b[1,1]+c[0,0] c[0,1] 0
0 0 c[1,0] c[1,1]+d[0,0] d[0,1]
0 0 0 d[1,0] d[1,1]
形成这个的一种方法是block_diag
在这里进行了演示。它涉及一个表达式,每个 2x2 数组都有一个术语,可以将其重写为循环,因此它并不能真正回答您的问题。
In [92]: a,b,c,d
Out[92]:
(array([[1, 2],
[3, 4]]),
array([[5, 6],
[7, 8]]),
array([[ 9, 10],
[11, 12]]),
array([[13, 14],
[15, 16]]))
In [93]: bd = sparse.block_diag # A convenient alias
In [94]: m = bd([a,0,0,0])+bd([0,b,0,0])+bd([0,0,c,0])+bd([0,0,0,d])
In [95]: m.A
Out[95]:
array([[ 1, 2, 0, 0, 0],
[ 3, 9, 6, 0, 0],
[ 0, 7, 17, 10, 0],
[ 0, 0, 11, 25, 14],
[ 0, 0, 0, 15, 16]])