Python fill_对角语法的解释

Python fill_对角语法的解释,python,numpy,diagonal,Python,Numpy,Diagonal,我很难理解这里是如何实现np.fill_对角线的 我找到了一篇文章,解释了用某些值填充子对角线和超对角线的方法,但我并不真正理解函数的参数。代码如下: a = np.zeros((4, 4)) b = np.ones(3) np.fill_diagonal(a[1:], b) np.fill_diagonal(a[:,1:], -b) 我不明白这里怎么用fill_对角线。我认为第二个论点必须是一个论点。另外,我不明白“a”的切片发生了什么情况。“对于a.ndim>=2的数组a,对角线是索引a[

我很难理解这里是如何实现np.fill_对角线的

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

a = np.zeros((4, 4))
b = np.ones(3)
np.fill_diagonal(a[1:], b)
np.fill_diagonal(a[:,1:], -b)
我不明白这里怎么用fill_对角线。我认为第二个论点必须是一个论点。另外,我不明白“a”的切片发生了什么情况。

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

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

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

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

==============================================================================================
感谢G.安德森的评论。我将此内容编辑到帖子中以引起注意:


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

您的示例涉及填充切片,
视图,原始数组的

In [79]: a = np.zeros((4, 4)) 
    ...: b = np.arange(1,5)                                                                                  
In [80]:        
简单的案例-填充整个阵列:

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
获取要填充的数组,并将值放入对角线中。文档中确实说了
标量
,但这太严格了。如我所示,它可以是大小合适的一维数组

In [82]: a = np.zeros((4, 4)) 
    ...: b = np.arange(1,4)                                                                                  
填充最后3行:

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列:

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\u diagonal
工作正常,
a[1://code>和
a[:,1://code>生成
a
的视图

填充后查看
a
的切片:

In [90]: a[:,1:]                                                                                             
Out[90]: 
array([[1., 0., 0.],
       [0., 2., 0.],
       [0., 0., 3.],
       [0., 0., 0.]])
这些文档演示了如何使用
np.fliplr(a)
。这也会创建一个
视图
,可以在适当的位置进行修改

实际写入是通过以下方式完成的:

a.flat[:end:step] = val
其中,
end
step
是根据尺寸计算的。例如,为了填充一个3x3数组,我们可以写入每4个元素

In [96]: a[:,1:].ravel()                                                                                     
Out[96]: array([1., 0., 0., 0., 2., 0., 0., 0., 3., 0., 0., 0.])

值得注意的是,
b
的长度不必与填充的对角线长度相同。如果
b
较长,则对角线的
n
元素将用b的第一个
n
元素填充。如果
n
比对角线短,则将重复
b
以填充对角线