ブロック対角行列は、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.]])
リスト内包表記を用いない方法はあるのだろうか?