我在NumPy中有三个相同大小的方形矩阵。我想将它们组合成块对角矩阵。
示例:
a1 = np.array([[1,1,1],[1,1,1],[1,1,1]])
a2 = np.array([[2,2,2],[2,2,2],[2,2,2]])
a3 = np.array([[3,3,3],[3,3,3],[3,3,3]])
r = np.array([[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3]])
这样做的最佳方式是什么?
答案 0 :(得分:18)
scipy.linalg有一个block_diag函数来自动执行此操作
>>> a1 = np.array([[1,1,1],[1,1,1],[1,1,1]])
>>> a2 = np.array([[2,2,2],[2,2,2],[2,2,2]])
>>> a3 = np.array([[3,3,3],[3,3,3],[3,3,3]])
>>> import scipy.linalg
>>> scipy.linalg.block_diag(a1, a2, a3)
array([[1, 1, 1, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 2, 2, 2, 0, 0, 0],
[0, 0, 0, 2, 2, 2, 0, 0, 0],
[0, 0, 0, 2, 2, 2, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 3, 3, 3],
[0, 0, 0, 0, 0, 0, 3, 3, 3],
[0, 0, 0, 0, 0, 0, 3, 3, 3]])
>>> r = np.array([[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,0,0], [0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,2,2,2,0,0,0],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3],[0,0,0,0,0,0,3,3,3]])
>>> (scipy.linalg.block_diag(a1, a2, a3) == r).all()
True
答案 1 :(得分:2)
如果你想要这个特定的数组r
,也许最简单的方法是:
r=np.kron(np.diag([1,2,3]),np.ones((3,3),dtype='int'))
如果a1
,a2
,a3
可以是任意的二维数组,那么最简单的方法可能就是:
a1=np.asmatrix(a1)
a2=np.asmatrix(a2)
a3=np.asmatrix(a3)
z=np.asmatrix(np.zeros((3,3)))
r=np.asarray(np.bmat('a1, z, z; z, a2, z; z, z, a3'))
另一种较慢的方法是:
r=(np.kron([[1,0,0],[0,0,0],[0,0,0]],a1)
+np.kron([[0,0,0],[0,1,0],[0,0,0]],a2)
+np.kron([[0,0,0],[0,0,0],[0,0,1]],a3))
答案 2 :(得分:1)
由于这些答案,numpy
添加了block
函数
In [695]: A=np.arange(1,10).reshape(3,3)
In [696]: B=np.arange(10,14).reshape(2,2)
In [698]: C = np.zeros((3,2),int)
In [699]: np.block([[A,C],[C.T,B]])
Out[699]:
array([[ 1, 2, 3, 0, 0],
[ 4, 5, 6, 0, 0],
[ 7, 8, 9, 0, 0],
[ 0, 0, 0, 10, 11],
[ 0, 0, 0, 12, 13]])