2010-11-11 58 views
12

我在NumPy中有三个相同大小的方形矩阵。我想将这些结合到一个块对角矩阵。如何将块转换为块对角矩阵(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]]) 

什么是做到这一点的最好方法是什么?

回答

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 
+0

这将是很好,如果这是在numpy的可用(无需另一种依赖)。 – amcnabb 2013-02-25 22:43:43

+0

scipy建立在numpy之上。我认为'scipy.array'应该和'numpy.array'基本上一样。 – hBy2Py 2015-03-04 19:05:25

2

如果你想这个阵列r,也许最简单的方法是:

r=np.kron(np.diag([1,2,3]),np.ones((3,3),dtype='int')) 

如果a1a2a3可任意2维数组,那么也许最简单的方法是:

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