numpy.fill_diagonal#

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

填充给定数组的任何维度的主对角线.

对于具有 a.ndim >= 2 的数组 a ,对角线是以所有相同索引 i 的值的列表 a[i, ..., i] .此函数就地修改输入数组,而不返回值.

参数:
a数组,至少是二维的.

要就地填充其对角线的数组.

val标量或类数组

要在对角线上写入的值.如果 val 是标量,则该值将沿对角线写入.如果是类数组,则将展平的 val 沿对角线写入,如果需要,重复以填充所有对角线项.

wrapbool

对于 NumPy 1.6.2 版本之前的较高矩阵,对角线在 N 列后“换行”.您可以使用此选项获得此行为.这仅影响较高矩阵.

注释

此功能可以通过 diag_indices 获得,但此版本在内部使用了一个更快的实现,它从不构建索引,而是使用简单的切片.

示例

>>> import numpy as np
>>> 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]])

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