numpy.put_along_axis

numpy.put_along_axis(arr, indices, values, axis)

Функция put_along_axis() сопоставляет одномерные массивы индексов с соответствующими полными срезами исходного массива вдоль указанной оси и вставляет туда указанные значения. Доступно в NumPy начиная с версии 1.15.0.

В общем, на деле все гораздо проще, так что если ничего не понятно, то лучше сразу перейдите к примерам.

Параметры:
arr - массив NumPy или массивоподобный объект.
Исходный массив.
indices - массив NumPy (необязательный параметр).
Массив индексов, который должен быть либо транслируемым по массиву arr либо содержать столько же одномерных массивов сколько их в индексируемом массиве вдоль указанной в параметре axis оси.
values - массив NumPy, массивоподобный объектцелое или число.
Значения для вставки. Если это массив или массивоподобный объект, то его форма должна учитывать параметр indices.
axis - целое число (необязательный параметр).
Определяет ось вдоль которой извлекаются элементы с указанными в одномерных массивах индексами. По умолчанию axis = None, что соответствует извелечению элементов из сжатого до одной оси представления массива a.
Возвращает:
Данная функция ничего не возвращает, а сразу изменяет исходный массив arr.
Смотрите так же:
take_along_axis, put, place


Примеры

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

>>> import numpy as np
>>> 
>>> a = np.arange(16).reshape(4, 4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
>>> 
>>> ind = np.array([[3, 0, 2, 1]])
>>> 
>>> np.take_along_axis(a, ind, axis = 0)
array([[12,  1, 10,  7]])
>>> 
>>> 
>>> np.put_along_axis(a, ind, 777, axis = 0)
>>> a
array([[  0, 777,   2,   3],
       [  4,   5,   6, 777],
       [  8,   9, 777,  11],
       [777,  13,  14,  15]])

Данная функция замечательно подходит для использования функций возвращающих индексы элементов, например таких как sort(), argsort(), argpartition и т.д.

Допустим, необходимо заменить в каждой строке массива a его минимальный и максимальный элементы:

>>> a = np.random.randint(40, 60, size = (6, 6))
>>> a
array([[55, 48, 58, 46, 48, 41],
       [51, 50, 57, 49, 49, 58],
       [53, 40, 57, 55, 59, 53],
       [57, 58, 57, 56, 54, 51],
       [48, 53, 49, 49, 41, 54],
       [44, 42, 56, 51, 56, 47]])
>>> 
>>> 
>>> a_min_r = np.expand_dims(np.argmin(a, axis=1), axis=1)
>>> a_max_r = np.expand_dims(np.argmax(a, axis=1), axis=1)
>>> 
>>> ind = np.hstack((a_min_r, a_max_r))
>>> ind
array([[5, 2],
       [3, 5],
       [1, 4],
       [5, 1],
       [4, 5],
       [1, 2]], dtype=int32)
>>> 
>>> np.take_along_axis(a, ind, axis=1)
array([[41, 58],
       [49, 58],
       [40, 59],
       [51, 58],
       [41, 54],
       [42, 56]])
>>> 
>>> val = np.hstack((np.zeros((6, 1)), np.full((6, 1), 100)))
>>> val
array([[  0., 100.],
       [  0., 100.],
       [  0., 100.],
       [  0., 100.],
       [  0., 100.],
       [  0., 100.]])
>>> 
>>> 
>>> np.put_along_axis(a, ind, val, axis = 1)
>>> a
array([[ 55,  48, 100,  46,  48,   0],
       [ 51,  50,  57,   0,  49, 100],
       [ 53,   0,  57,  55, 100,  53],
       [ 57, 100,  57,  56,  54,   0],
       [ 48,  53,  49,  49,   0, 100],
       [ 44,   0, 100,  51,  56,  47]])