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

问题描述

我正在尝试用单独数组的列填充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.diagsscipy.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]])

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...