numpy.fill_diagonal

numpy.fill_diagonal(a, val, wrap=False)[源代码]

填充任意维数的给定数组的主对角线。

对于数组 a 具有 a.ndim >= 2 ,对角线是带有索引的位置列表 a[i, ..., i] 完全相同。此函数在适当位置修改输入数组,但不返回值。

参数
a数组,至少二维。

要填充其对角线的数组,它将在适当的位置进行修改。

val标量或类数组

写在对角线上的值。如果 val 是标量,值沿对角线写入。如果像数组,则 val 是沿着对角线写的,如果需要的话,重复填写所有对角线条目。

wrap布尔

对于numpy版本1.6.2之前的高矩阵,对角线“包裹”在n列之后。您可以使用此选项进行此行为。这只影响高矩阵。

笔记

1.4.0 新版功能.

此功能可通过以下方式获得: diag_indices 但在内部,这个版本使用了一个更快的实现,它从不构造索引并使用简单的切片。

实例

>>> a = np.zeros((3, 3), int)
>>> np.fill_diagonal(a, 5)
>>> a
array([[5, 0, 0],
       [0, 5, 0],
       [0, 0, 5]])

相同的功能可以在4-D数组上操作:

>>> a = np.zeros((3, 3, 3, 3), int)
>>> np.fill_diagonal(a, 4)

为了清晰起见,我们只显示几个块:

>>> a[0, 0]
array([[4, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])
>>> a[1, 1]
array([[0, 0, 0],
       [0, 4, 0],
       [0, 0, 0]])
>>> a[2, 2]
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 4]])

wrap选项只影响高矩阵:

>>> # tall matrices no wrap
>>> a = np.zeros((5, 3), int)
>>> np.fill_diagonal(a, 4)
>>> a
array([[4, 0, 0],
       [0, 4, 0],
       [0, 0, 4],
       [0, 0, 0],
       [0, 0, 0]])
>>> # tall matrices wrap
>>> a = np.zeros((5, 3), int)
>>> np.fill_diagonal(a, 4, wrap=True)
>>> a
array([[4, 0, 0],
       [0, 4, 0],
       [0, 0, 4],
       [0, 0, 0],
       [4, 0, 0]])
>>> # wide matrices
>>> a = np.zeros((3, 5), int)
>>> np.fill_diagonal(a, 4, wrap=True)
>>> a
array([[4, 0, 0, 0, 0],
       [0, 4, 0, 0, 0],
       [0, 0, 4, 0, 0]])

反对角线可以通过使用 numpy.flipudnumpy.fliplr .

>>> a = np.zeros((3, 3), int);
>>> np.fill_diagonal(np.fliplr(a), [1,2,3])  # Horizontal flip
>>> a
array([[0, 0, 1],
       [0, 2, 0],
       [3, 0, 0]])
>>> np.fill_diagonal(np.flipud(a), [1,2,3])  # Vertical flip
>>> a
array([[0, 0, 3],
       [0, 2, 0],
       [1, 0, 0]])

请注意,对角线的填充顺序因翻转函数而异。