将 numpy 数组堆叠到对角线上

Stack numpy array onto diagonal

给定 N 个 2d numpy 数组,有没有一种巧妙的方法可以让我 'stack' 或 'bolt' 它们在对角线上一起,用 0 填充任何新的槽?例如。给定:

arr1 = np.array([[1, 2],
                 [3, 4]])

arr2 = np.array([[9, 8, 7],
                 [6, 5, 4],
                 [3, 2, 1]])

我要创建:

arr = np.array([[1, 2, 0, 0, 0],
                [3, 4, 0, 0, 0], 
                [0, 0, 9, 8, 7],
                [0, 0, 6, 5, 4],
                [0, 0, 3, 2, 1]])

尝试:

>>> arr = np.zeros((5, 5))
>>> arr[:2, :2] = arr1
>>> arr[2:, 2:] = arr2

并且,为了验证它是否有效,我们可以显示 arr:

>>> arr
array([[ 1.,  2.,  0.,  0.,  0.],
       [ 3.,  4.,  0.,  0.,  0.],
       [ 0.,  0.,  9.,  8.,  7.],
       [ 0.,  0.,  6.,  5.,  4.],
       [ 0.,  0.,  3.,  2.,  1.]])

There's a function for that.

scipy.linalg.block_diag(arr1, arr2)

它可以接受任意多个参数:

scipy.linalg.block_diag(*list_of_arrays)

我刚刚发现这似乎完全符合我的需要:

https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.linalg.block_diag.html

>> from scipy.linalg import block_diag
>>> A = [[1, 0],
...      [0, 1]]
>>> B = [[3, 4, 5],
...      [6, 7, 8]]
>>> C = [[7]]
>>> block_diag(A, B, C)
[[1 0 0 0 0 0]
 [0 1 0 0 0 0]
 [0 0 3 4 5 0]
 [0 0 6 7 8 0]
 [0 0 0 0 0 7]]

np 有一个相对较新的 block 函数,可以连接嵌套的数组列表。但它需要指定零填充块:

In [15]: np.block([[arr1, np.zeros((2,3),int)], [np.zeros((3,2),int), arr2]])
Out[15]: 
array([[1, 2, 0, 0, 0],
       [3, 4, 0, 0, 0],
       [0, 0, 9, 8, 7],
       [0, 0, 6, 5, 4],
       [0, 0, 3, 2, 1]])