将3D numpy数组转换为分块对角矩阵

5

我正在寻找一种将nXaXb的numpy数组转换为块对角矩阵的方法。我已经了解到scipy.linalg.block_diag,但它的缺点是(对于我的情况)需要分别给出矩阵的每个块。然而,当n非常高时,这是具有挑战性的,因此为了使事情更清晰,假设我有一个

import numpy as np    
a = np.random.rand(3,2,2)
array([[[ 0.33599705,  0.92803544],
        [ 0.6087729 ,  0.8557143 ]],
       [[ 0.81496749,  0.15694689],
        [ 0.87476697,  0.67761456]],
       [[ 0.11375185,  0.32927167],
        [ 0.3456032 ,  0.48672131]]])

我想要实现的是与以下内容相同的东西
from scipy.linalg import block_diag
block_diag(a[0], a[1],a[2])
array([[ 0.33599705,  0.92803544,  0.        ,  0.        ,  0.        ,   0.        ],
       [ 0.6087729 ,  0.8557143 ,  0.        ,  0.        ,  0.        ,   0.        ],
       [ 0.        ,  0.        ,  0.81496749,  0.15694689,  0.        ,   0.        ],
       [ 0.        ,  0.        ,  0.87476697,  0.67761456,  0.        ,   0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.11375185,   0.32927167],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.3456032 ,   0.48672131]])

这只是一个例子,实际情况下a可能有数百个元素。
1个回答

8
尝试使用block_diag(*a)。以下是示例:
In [9]: paste
import numpy as np
a = np.random.rand(3,2,2)
from scipy.linalg import block_diag
b = block_diag(a[0], a[1],a[2])

c = block_diag(*a)
b == c

## -- End pasted text --
Out[9]:
array([[ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True,  True]], dtype=bool)

(为避免显示充满“True”的枯燥数组,您可以展示(b == c).all()np.allclose(b,c)的结果。) - DSM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接