问题描述
我正在尝试用单独数组的列填充numpy数组的对角线。有没有办法对类似于numpy.fill_diagonal的非对角线执行此操作?
假设:
A = np.zeros((4,4))
array([[0.,0.,0.],[0.,0.]])
B = np.tril(np.arange(1,17).reshape(4,4),-1)
array([[ 0,0],[ 5,[ 9,10,[13,14,15,0]]))
有什么办法用B列填充A的对角线吗?假设我想要A = B [1:4,0]的对角线-1关闭,从而得到以下数组。
B[1:4,0] = array([ 5,9,13])
A =
array([[0.,[5.,9.,13,0.]])
依此类推,直到A的最终输出为
A =
array([[0.,[10,[15,0.]])
据我所知numpy.fill_diagonal提供了一种填充主对角线的方法,但是没有用于非对角线的参数。 numpy.diag确实具有非对角线参数来创建数组,但似乎每个数组不允许有多个非对角线参数。因此不允许这样做。
numpy.diag_indices也仅返回主对角线的索引,因此我现在可以完成此操作。
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.diags
和scipy.sparse.spdiags
,尽管它们的名字都能够产生密集的输出。
使用您特定的输入格式spdiags
效果更好:
scipy.sparse.spdiags(B.T[:-1],[1,2,3],4,format="array").T
# array([[ 0,0],# [ 5,# [10,9,# [15,14,13,0]])