覚え書きブログ

ブロック対角行列

ブロック対角行列は、numpyのkronとeyeを用いて作ることができる。

例えば、以下の6行3列の行列zの2行ずつ取り出して対角に並べてみる。

 z=np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]])
> z
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12],
       [13, 14, 15],
       [16, 17, 18]]
> [np.kron(np.eye(3)[i:i+1],z[i:i+1,:]) for i in range(3)]
[array([[1., 2., 3., 0., 0., 0., 0., 0., 0.]]), array([[0., 0., 0., 4., 5., 6., 0., 0., 0.]]), array([[0., 0., 0., 0., 0., 0., 7., 8., 9.]])]
>np.vstack([np.kron(np.eye(3)[i:i+1],z[i:i+1,:]) for i in range(3)])
array([[1., 2., 3., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 4., 5., 6., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 7., 8., 9.]])

リスト内包表記を用いない方法はあるのだろうか?