Spec-Zone.ru › NumPy 1.17

numpy.fill_diagonal

numpy.fill_diagonal(a, val, wrap=False) [source]

Заполнить главную диагональ данного массива любой размерности.

Для массива a с a.ndim >= 2, диагональ — это список расположений с индексами a[i, ..., i] , все одинаковые. Эта функция изменяет входной массив на месте, она не возвращает значение.

Параметры:
a : array, at least 2-D.

Массив, диагональ которого должна быть заполнена, он изменяется на месте.

val : scalar

Значение, которое должно быть записано на диагонали, его тип должен быть совместим с типом массива a.

wrap : bool

Для высоких матриц в NumPy версии до 1.6.2 диагональ «заворачивалась» после N столбцов. Вы можете получить такое поведение с помощью этого параметра. Это влияет только на высокие матрицы.

См. также

diag_indices, diag_indices_from

Замечания

Новая в версии 1.4.0.

Данный функционал можно получить через diag_indices, но внутренне эта версия использует гораздо более быструю реализацию, которая никогда не создает индексы и использует простую срезу.

Примеры

>>> 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]])

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

© 2005–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.17.0/reference/generated/numpy.fill_diagonal.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API