2015-11-03 45 views
7

私は、同じ数の列と行を持つ2次元numpy配列を持っています。私はそれらを対角線上のより小さいアレイを有するより大きなアレイに配置したいと思う。開始行列を対角線上に置く頻度を指定することが可能でなければなりません。例えば:私はこの配列を望んでいた場合与えられたnumpy配列からブロック対角numpy配列を作成します。

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

だから、対角線上の2回は、所望の出力は次のようになります。3回

array([[5, 7, 0, 0], 
     [6, 3, 0, 0], 
     [0, 0, 5, 7], 
     [0, 0, 6, 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メソッドで実装し、開始配列の任意のサイズに対して(開始配列に同じ数の行と列があると考えていますか?) numpy.kron

答えて

11

クラシックケース -

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

サンプル実行 - あなたは対角線にX異なる行列を挿入する必要がある場合

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

はどのようにあなたがこれを行うのでしょうか?私はブロック対角行列にする必要がある80の異なる行列を持っています。 –

+0

@ Will.Evo全部で80の同じ形ですか? – Divakar

+0

はいすべて同じ形 –

関連する問題