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

5 投票
1 回答
1853 浏览
提问于 2025-04-18 09:19

我想找到一种方法,把一个 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)

撰写回答