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, diag_indices_from

Примечания

Эта функциональность может быть получена через 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]])

Обратите внимание, что порядок заполнения диагонали варьируется в зависимости от функции переворота.