Numpy 带偏移量的块对角矩阵

Numpy 带偏移量的块对角矩阵,numpy,Numpy,Numpy提供了一种使用偏移从单个元素创建对角线矩阵的方法。现在,我有一个由2*2个块组成的列表,这些块不是单个元素,而是沿着对角线以指定的偏移量插入。 下面是11个2*2阵列块,应沿24*24矩阵的+1偏移量进行拟合。我知道scipy.linalg.block_diag可以为零(隐式)偏移创建块对角线 通常,我有一个2*2块数组的列表,我想沿着主2*2块对角线的指定偏移插入这些块 [array([[ 1, 8],[ 5, 40]]), array([[ 2, 7],[10, 35]]),

Numpy提供了一种使用偏移从单个元素创建对角线矩阵的方法。现在,我有一个由2*2个块组成的列表,这些块不是单个元素,而是沿着对角线以指定的偏移量插入。 下面是11个2*2阵列块,应沿24*24矩阵的+1偏移量进行拟合。我知道scipy.linalg.block_diag可以为零(隐式)偏移创建块对角线

通常,我有一个2*2块数组的列表,我想沿着主2*2块对角线的指定偏移插入这些块

[array([[ 1,  8],[ 5, 40]]), array([[ 2,  7],[10, 35]]), array([[0, 0],        [0, 0]]), array([[ 3, 6],[15, 30]]), array([[ 4, 5],[20, 25]]),array([[0, 0],[0, 0]]), array([[ 5, 4],[25, 20]]), array([[ 6, 3],[30, 15]]), array([[0, 0],[0, 0]]), array([[ 7, 2],[35, 10]]), array([[ 8, 1], [40, 5]])]

通过在宽度/高度为零的数组前面加上前缀,可以使
block_diag
创建偏移:

from scipy import linalg

blocks = np.multiply.outer(np.arange(1,4), np.ones((2,2), int))
offset = 3
aux = np.empty((0, offset), int)

linalg.block_diag(aux.T, *blocks, aux)
# array([[0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [1, 1, 0, 0, 0, 0, 0, 0, 0],
#        [1, 1, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 2, 2, 0, 0, 0, 0, 0],
#        [0, 0, 2, 2, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 3, 3, 0, 0, 0],
#        [0, 0, 0, 0, 3, 3, 0, 0, 0]])
linalg.block_diag(aux, *blocks, aux.T)
# array([[0, 0, 0, 1, 1, 0, 0, 0, 0],
#        [0, 0, 0, 1, 1, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 2, 2, 0, 0],
#        [0, 0, 0, 0, 0, 2, 2, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 3, 3],
#        [0, 0, 0, 0, 0, 0, 0, 3, 3],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 0]])

所有
block\u diag
所做的就是迭代块并插入到右切片中,
out[r:r+rr,c:c+cc]=arrs[i]
。这里没有神奇的编译代码。只是简单的迭代和索引。谢谢,但是这里的偏移将块插入主对角线下方。我宁愿在主对角线上方有正偏移,在主对角线下方有负偏移diagonal@Sommy请再看一遍。块是在下面还是在上面只是交换
aux
aux.T
的问题。