numpy.fill_diagonal#
- numpy.fill_diagonal(a, val, обернуть=False)[источник]#
Заполнить главную диагональ данного массива любой размерности.
Для массива a с
a.ndim >= 2, диагональ — это список значенийa[i, ..., i]с индексамиiвсе идентичны. Эта функция изменяет входной массив на месте без возврата значения.- Параметры:
- aмассив, как минимум 2-D.
Массив, чья диагональ должна быть заполнена на месте.
- valскаляр или array_like
Значение(я) для записи на диагонали. Если val является скаляром, значение записывается вдоль диагонали. Если массивоподобный, развёрнутый val записывается по диагонали, повторяясь при необходимости для заполнения всех диагональных элементов.
- обернутьbool
Для высоких матриц в 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-мерным массивом:
>>> 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]])
Обратите внимание, что порядок заполнения диагонали варьируется в зависимости от функции переворота.