numpy.fill_diagonal#
- numpy.fill_diagonal(a, val, wrap=False)[source]#
填充给定任何维度的数组的主对角线。
对于具有
a.ndim >= 2
的数组 a,对角线是值列表a[i, ..., i]
,其中索引i
全部相同。此函数对输入数组进行就地修改,不返回值。- 参数:
- a数组,至少是 2 维的。
其对角线要就地填充的数组。
- val标量或类数组
要写入对角线的值。如果 val 是标量,则该值将写入对角线。如果是类数组,则扁平化的 val 将写入对角线,如果需要,将重复以填充所有对角线条目。
- wrap布尔值
对于 NumPy 版本 1.6.2 之前的长矩阵,对角线在 N 列之后“环绕”。您可以通过此选项获得此行为。这仅影响长矩阵。
备注
版本 1.4.0 中新增。
此功能可以通过
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 维数组
>>> 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.flipud
或numpy.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]])
请注意,填充对角线的顺序会因翻转函数的不同而不同。