有没有办法填充类似于 numpy.fill_diagonal 的 numpy 数组的非对角线?

Is there a way to populate the off diagonals of a numpy array similar to numpy.fill_diagonal?

我正在尝试用单独数组的列填充 numpy 数组的非对角线。有没有办法对类似于 numpy.fill_diagonal?

的非对角线执行此操作

假设:

A = np.zeros((4,4))

array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])

B = np.tril(np.arange(1,17).reshape(4,4),-1)  

array([[ 0,  0,  0,  0],
       [ 5,  0,  0,  0],
       [ 9, 10,  0,  0],
       [13, 14, 15,  0]]))

有没有办法用 B 的列填充 A 的非对角线?假设我想要 A = B[1:4,0] 的 -1 对角线,得到以下数组。

B[1:4,0] = array([ 5,  9, 13]) 

A = 
array([[0., 0., 0., 0.],
       [5., 0., 0., 0.],
       [0., 9., 0., 0.],
       [0., 0., 13, 0.]])

依此类推,直到 A 的最终输出为

A = 
array([[0., 0., 0., 0.],
       [5., 0., 0., 0.],
       [10, 9., 0., 0.],
       [15, 14, 13, 0.]])

据我所知,numpy.fill_diagonal 提供了一种填充主对角线的方法,但没有用于非对角线的参数。 numpy.diag 确实有一个用于创建数组的非对角线参数,但它似乎不允许每个数组有一个以上的非对角线参数。所以不允许这样。

numpy.diag_indices 也只有 returns 主对角线的索引,所以我现在可以做到这一点是这样的。

 row,col = np.diag_indices(A.shape[0])
 for i in range(1,4): 
     A[row[i:],col[:-i]]=np.trim_zeros(B[:,i-1]) 

但只是想知道是否有更聪明的方法来解决这个问题,即可以直接填充非对角线的函数或用于处理更大数组的矢量化方法。

如果您追求方便,还有 scipy.sparse.diagsscipy.sparse.spdiags 尽管它们的名称能够产生密集的输出。

使用您的特定输入格式 spdiags 效果更好:

scipy.sparse.spdiags(B.T[:-1],[1,2,3],4,4,format="array").T
# array([[ 0,  0,  0,  0],
#        [ 5,  0,  0,  0],
#        [10,  9,  0,  0],
#        [15, 14, 13,  0]])