numpy.fill_diagonal#

numpy.fill_diagonal(a, val, wrap=False)[原始碼]#

填充給定任意維度陣列的主對角線。

對於一個陣列 aa.ndim >= 2,對角線是由索引 i 皆相同的 a[i, ..., i] 值列表組成。此函數會就地修改輸入陣列,且不傳回值。

參數::
a陣列,至少二維。

要就地填充對角線的陣列。

val純量或類陣列

要寫入對角線的值。如果 val 是純量,則該值會沿著對角線寫入。如果為類陣列,則扁平化的 val 會沿著對角線寫入,必要時重複以填滿所有對角線項目。

wrap布林值

對於 NumPy 1.6.2 版本之前的長矩陣,對角線在 N 行後會「wrap」。您可以使用此選項來實現此行為。這僅影響長矩陣。

註解

此功能可以透過 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.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]])

請注意,對角線填充的順序會根據翻轉函數而有所不同。