首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >fill_diagonal语法说明

fill_diagonal语法说明
EN

Stack Overflow用户
提问于 2019-09-06 03:04:36
回答 2查看 113关注 0票数 0

我很难理解np.fill_diagonal是如何在这里实现的。

我找到了一篇文章here,解释了一种用特定值填充次对角线和超对角线的方法,但我并不真正理解该函数的参数。代码如下:

代码语言:javascript
运行
复制
a = np.zeros((4, 4))
b = np.ones(3)
np.fill_diagonal(a[1:], b)
np.fill_diagonal(a[:,1:], -b)

我不明白fill_diagonal在这里是怎么用的。我认为第二个参数必须是一个scalar。另外,我不明白'a‘的片断是怎么回事。

EN

回答 2

Stack Overflow用户

发布于 2019-09-06 03:19:35

“对于带有a.ndim >= 2的数组,对角线是索引a[i, ..., i]完全相同的位置列表。此函数原地修改输入数组,它不返回值。”(Source)此方法的文档说明b应该是标量,但是如果b是长度等于输入数组的对角线长度的数组,则它将填充对角线的b的值。

关键是b中的元素数等于a的每个子数组对角线上的元素数。子数组的_n_th对角线值由b的_n_th值填充。

修改的a的第一个子数组是a的第一行(这意味着3行4列),因此对角线元素的数量是3。

a的第二个子数组是a的最后三列(4x3矩阵),它也只有3个对角元素。

==========================================================================

感谢G. Anderson的评论。我正在编辑这篇文章,以引起人们的注意:

值得注意的是,b不必与它填充的对角线具有相同的长度。如果b较长,则对角线的n个元素将由b的前n个元素填充。如果n小于对角线,则b将重复填充对角线。

票数 1
EN

Stack Overflow用户

发布于 2019-09-06 03:40:21

您的示例涉及填充原始数组的片、views

代码语言:javascript
运行
复制
In [79]: a = np.zeros((4, 4)) 
    ...: b = np.arange(1,5)                                                                                  
In [80]:        

简单的案例-填充整个数组:

代码语言:javascript
运行
复制
In [80]: np.fill_diagonal(a,b)                                                                               
In [81]: a                                                                                                   
Out[81]: 
array([[1., 0., 0., 0.],
       [0., 2., 0., 0.],
       [0., 0., 3., 0.],
       [0., 0., 0., 4.]])

fill_diagonal接受要填充的数组和要放入对角线的值。文档中确实提到了scalar,但这限制太多了。正如我所展示的,它可以是一个大小合适的一维数组。

代码语言:javascript
运行
复制
In [82]: a = np.zeros((4, 4)) 
    ...: b = np.arange(1,4)                                                                                  

填充最后3行:

代码语言:javascript
运行
复制
In [83]: a[1:]                                                                                               
Out[83]: 
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])
In [84]: np.fill_diagonal(a[1:],b)                                                                           
In [85]: a                                                                                                   
Out[85]: 
array([[0., 0., 0., 0.],
       [1., 0., 0., 0.],
       [0., 2., 0., 0.],
       [0., 0., 3., 0.]])

In [86]: a = np.zeros((4, 4)) 
    ...: b = np.arange(1,4)

填写最后3列:

代码语言:javascript
运行
复制
In [87]: a[:,1:]                                                                                             
Out[87]: 
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])
In [88]: np.fill_diagonal(a[:,1:],b)                                                                         
In [89]: a                                                                                                   
Out[89]: 
array([[0., 1., 0., 0.],
       [0., 0., 2., 0.],
       [0., 0., 0., 3.],
       [0., 0., 0., 0.]])

关键是fill_diagonal就地工作,a[1:]a[:,1:]生成a的视图。

查看填充后的a切片:

代码语言:javascript
运行
复制
In [90]: a[:,1:]                                                                                             
Out[90]: 
array([[1., 0., 0.],
       [0., 2., 0.],
       [0., 0., 3.],
       [0., 0., 0.]])

文档演示了如何与np.fliplr(a)一起使用。这也创建了一个可以就地修改的view

实际的写入是用以下命令完成的:

代码语言:javascript
运行
复制
a.flat[:end:step] = val

其中endstep是根据尺寸计算得出的。例如,要填充一个3x3数组,我们可以每4个元素写入一次。

代码语言:javascript
运行
复制
In [96]: a[:,1:].ravel()                                                                                     
Out[96]: array([1., 0., 0., 0., 2., 0., 0., 0., 3., 0., 0., 0.])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57811604

复制
相关文章

相似问题

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