numpy.put_along_axis#

numpy.put_along_axis(arr, индексы, values, ось)[источник]#

Поместить значения в целевой массив, сопоставляя одномерные срезы индекса и данных.

Это итерирует по соответствующим 1D срезам, ориентированным вдоль указанной оси в массивах индексов и данных, и использует первые для размещения значений в последних. Эти срезы могут быть разной длины.

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

Параметры:
arrndarray (Ni..., M, Nk...)

Целевой массив.

индексыndarray (Ni…, J, Nk…)

Индексы для изменения вдоль каждого одномерного среза arr. Это должно соответствовать размерности arr, но размерности в Ni и Nj могут быть 1 для трансляции относительно arr.

valuesarray_like (Ni…, J, Nk…)

значения для вставки по этим индексам. Его форма и размерность транслируются для соответствия indices.

осьint

Ось, вдоль которой берутся 1d срезы. Если axis None, целевой массив обрабатывается как если бы было создано сглаженное 1d представление.

Смотрите также

take_along_axis

Извлечение значений из входного массива путем сопоставления 1D индексов и срезов данных

Примечания

Это эквивалентно (но быстрее) следующему использованию ndindex и s_, который устанавливает каждый из ii и kk в кортеж индексов:

Ni, M, Nk = a.shape[:axis], a.shape[axis], a.shape[axis+1:]
J = indices.shape[axis]  # Need not equal M

for ii in ndindex(Ni):
    for kk in ndindex(Nk):
        a_1d       = a      [ii + s_[:,] + kk]
        indices_1d = indices[ii + s_[:,] + kk]
        values_1d  = values [ii + s_[:,] + kk]
        for j in range(J):
            a_1d[indices_1d[j]] = values_1d[j]

Эквивалентно, устраняя внутренний цикл, последние две строки будут:

a_1d[indices_1d] = values_1d

Примеры

>>> import numpy as np

Для этого примера массива

>>> a = np.array([[10, 30, 20], [60, 40, 50]])

Мы можем заменить максимальные значения на:

>>> ai = np.argmax(a, axis=1, keepdims=True)
>>> ai
array([[1],
       [0]])
>>> np.put_along_axis(a, ai, 99, axis=1)
>>> a
array([[10, 99, 20],
       [99, 40, 50]])