numpy.fill_diagonal#
- numpy.fill_diagonal(a, val, wrap=False)[原始碼]#
填充給定任意維度陣列的主對角線。
對於一個陣列 a 且
a.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.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]])
請注意,對角線填充的順序會根據翻轉函數而有所不同。