首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法填充类似于numpy.fill_diagonal的numpy数组的外对角线?

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

Stack Overflow用户
提问于 2020-09-09 01:53:28
回答 1查看 184关注 0票数 2

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

假设:

代码语言:javascript
运行
复制
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= B1:4,0的-1对角线,结果是下面的数组。

代码语言:javascript
运行
复制
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的最终输出为

代码语言:javascript
运行
复制
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也只返回主对角线的索引,所以我现在可以这样做。

代码语言:javascript
运行
复制
 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]) 

但只是想知道是否有更聪明的方法,即可以直接填充外对角线的函数,或者处理更大数组的矢量化方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-09 05:32:55

如果您追求的是方便,那么还有scipy.sparse.diagsscipy.sparse.spdiags,尽管它们的名字不同,但它们能够产生密集的输出。

对于您特定的输入格式,spdiags可以更好地工作:

代码语言:javascript
运行
复制
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]])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63799229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档