numpy.fill_diagonal

numpy.fill_diagonal(a, val, wrap=False)

Функция fill_diagonal() изменяет элементы главной диагонали на указанное значение в массиве любой формы и любой размерности.

Главная диагональ многомерных массивов интерпретируется как набор элементов с одинаковыми индексами a[i, i, ..., i], при этом массив вовсе не обязан быть "квадратным".

Параметры:
a - массив NumPy.
Исходный массив, который, по меньшей мере должен быть двумерным.
val - скалярное значение.
Значение на которое будет заменены элементы главной диагонали. Тап данных данного значения должен быть совместим с типом данных массива a.
wrap - True или False.
Данный параметр действует для массивов чья высота больше ширины. Если данный параметр установлен в True, то главная диагональ будет циклически продолжаться по все столбцам.
Возвращает:
Данная функция ничего не возвращает, а сразу изменяет исходный массив a.
Смотрите так же:
diag_indices, diag_indices_from, diag, diagflat, diagonal

Замечание

Сделать замену элементов главной диагонали можно с помощью функции numpy.diag_indices(), но внутрення реализация fill_diagonal не вычисляет промежуточных индексов, а использует срезы, что делает ее несколько быстрее.



Примеры

>>> import numpy as np
>>> 
>>> a = np.zeros((4, 4), int)
>>> a
array([[0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])
>>> 
>>> np.fill_diagonal(a, 1)
>>> a
array([[1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1]])

Главная диагональ многомерных массивов это просто элементы с одинаковыми индексами:

>>> a = np.zeros((3, 3, 3), int)
>>> np.fill_diagonal(a, 111)
>>> a
array([[[111,   0,   0],
        [  0,   0,   0],
        [  0,   0,   0]],

       [[  0,   0,   0],
        [  0, 111,   0],
        [  0,   0,   0]],

       [[  0,   0,   0],
        [  0,   0,   0],
        [  0,   0, 111]]])

Параметр wrap позволяет определить поведение диагонали для "высоких" матриц:

>>> a = np.zeros((6, 3), int)
>>> np.fill_diagonal(a, 111)
>>> a
array([[111,   0,   0],
       [  0, 111,   0],
       [  0,   0, 111],
       [  0,   0,   0],
       [  0,   0,   0],
       [  0,   0,   0]])
>>> 
>>> 
>>> a = np.zeros((6, 3), int)
>>> np.fill_diagonal(a, 111, wrap = True)
>>> a
array([[111,   0,   0],
       [  0, 111,   0],
       [  0,   0, 111],
       [  0,   0,   0],
       [111,   0,   0],
       [  0, 111,   0]])

На "широкие" матрицы данный параметр не оказывает никакого действия:

>>> a = np.zeros((3, 6), int)
>>> np.fill_diagonal(a, 111, wrap = True)
>>> a
array([[111,   0,   0,   0,   0,   0],
       [  0, 111,   0,   0,   0,   0],
       [  0,   0, 111,   0,   0,   0]])