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
.
Замечание
Сделать замену элементов главной диагонали можно с помощью функции 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]])