发布于 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将重复填充对角线。
发布于 2019-09-06 03:40:21
您的示例涉及填充原始数组的片、views
。
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
接受要填充的数组和要放入对角线的值。文档中确实提到了scalar
,但这限制太多了。正如我所展示的,它可以是一个大小合适的一维数组。
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_diagonal
就地工作,a[1:]
和a[:,1:]
生成a
的视图。
查看填充后的a
切片:
In [90]: a[:,1:]
Out[90]:
array([[1., 0., 0.],
[0., 2., 0.],
[0., 0., 3.],
[0., 0., 0.]])
文档演示了如何与np.fliplr(a)
一起使用。这也创建了一个可以就地修改的view
。
实际的写入是用以下命令完成的:
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.])
https://stackoverflow.com/questions/57811604
复制相似问题