2015-11-03 159 views
7

我有一个二维numpy数组,具有相同数量的列和行。我想将它们排列成一个更大的阵列,并在对角线上放置较小的阵列。应该可以指定起始矩阵应该在对角线上的频率。例如:从给定的numpy数组创建块对角线numpy阵列

a = numpy.array([[5, 7], 
       [6, 3]]) 

所以,如果我想这个数组对角线上的期望输出2倍是:

array([[5, 7, 0, 0], 
     [6, 3, 0, 0], 
     [0, 0, 5, 7], 
     [0, 0, 6, 3]]) 

3次:

array([[5, 7, 0, 0, 0, 0], 
     [6, 3, 0, 0, 0, 0], 
     [0, 0, 5, 7, 0, 0], 
     [0, 0, 6, 3, 0, 0], 
     [0, 0, 0, 0, 5, 7], 
     [0, 0, 0, 0, 6, 3]]) 

有一个快速的方法用numpy方法和任意大小的起始数组实现这一点(仍然考虑起始数组具有相同数量的行和列)?

回答

11

numpy.kron经典案例 -

np.kron(np.eye(n), a) 

采样运行 -

In [57]: n = 2 

In [58]: np.kron(np.eye(n), a) 
Out[58]: 
array([[ 5., 7., 0., 0.], 
     [ 6., 3., 0., 0.], 
     [ 0., 0., 5., 7.], 
     [ 0., 0., 6., 3.]]) 

In [59]: n = 3 

In [60]: np.kron(np.eye(n), a) 
Out[60]: 
array([[ 5., 7., 0., 0., 0., 0.], 
     [ 6., 3., 0., 0., 0., 0.], 
     [ 0., 0., 5., 7., 0., 0.], 
     [ 0., 0., 6., 3., 0., 0.], 
     [ 0., 0., 0., 0., 5., 7.], 
     [ 0., 0., 0., 0., 6., 3.]]) 
+0

你会如何做,如果你需要插入X不同矩阵转换成对角线?我有80个不同的矩阵,需要做成一个块对角矩阵。 –

+0

@ Will.Evo所有80个相同的形状? – Divakar

+0

是的所有相同的形状 –