将 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.]])
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]])
给定 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.]])
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]])