numpy.fill_diagonal#
- numpy.fill_diagonal(a, val, wrap=False)[源代码]#
填充给定任意维度的数组的主对角线.
对于一个
a.ndim >= 2
的数组 a,对角线是值a[i, ..., i]
的列表,其中索引i
全部相同.此函数就地修改输入数组,不返回值.- 参数:
- a数组,至少为二维.
要就地填充其对角线的数组.
- val标量或类数组
对角线上的值.如果 val 是标量,则该值沿对角线写入.如果是类数组,则展平的 val 沿对角线写入,必要时重复以填充所有对角线项.
- wrapbool
对于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]])
请注意,对角线填充的顺序会根据翻转函数的变化而变化.