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