numpy.take
- numpy.take(a, indices, axis=None, out=None, mode='raise')[source]
-
Извлечение элементов из массива по оси.
Когда ось не равна None, эта функция делает то же самое, что и «изящная» индексация (индексация массивов с помощью массивов); однако, она может быть проще в использовании, если вам нужны элементы по заданной оси. Вызов, такой как
np.take(arr, indices, axis=3)эквивалентенarr[:,:,:,indices,...].Объясняя без «изящной» индексации, это эквивалентно следующему использованию
ndindex, которое устанавливает каждый изii,jj, иkkв кортеж индексов:Ni, Nk = a.shape[:axis], a.shape[axis+1:] Nj = indices.shape for ii in ndindex(Ni): for jj in ndindex(Nj): for kk in ndindex(Nk): out[ii + jj + kk] = a[ii + (indices[jj],) + kk]- Параметры
-
- aarray_like (Ni…, M, Nk…)
-
Исходный массив.
- indicesarray_like (Nj…)
-
Индексы извлекаемых значений.
Добавлена в версии 1.8.0.
Также допускаются скалярные значения для индексов.
- axisint, необязательно
-
Ось, по которой следует выбирать значения. По умолчанию используется уплощенный входной массив.
- outndarray, необязательно (Ni…, Nj…, Nk…)
-
Если указано, результат будет помещен в этот массив. Он должен иметь соответствующую форму и тип данных. Обратите внимание, что
outвсегда буферизуется, еслиmode=’raise’; используйте другие режимы для повышения производительности. - mode{‘raise’, ‘wrap’, ‘clip’}, необязательно
-
Указывает, как будут обрабатываться индексы, выходящие за пределы границ.
- ‘raise’ – генерировать ошибку (по умолчанию)
- ‘wrap’ – циклический обход
- ‘clip’ – обрезать до диапазона
Режим ‘clip’ означает, что все индексы, которые слишком велики, заменяются индексом, адресованным последнему элементу по этой оси. Обратите внимание, что это отключает индексацию с отрицательными числами.
- Возвращаемое значение
-
- outndarray (Ni…, Nj…, Nk…)
-
Возвращаемый массив имеет тот же тип, что и
a.
См. также
compress-
Извлечение элементов с помощью логической маски
ndarray.take-
эквивалентный метод
take_along_axis-
Извлечение элементов по совпадению массивов и массивов индексов
Примечания
Исключая внутренний цикл в описании выше, и используя
s_для построения простых объектов срезов,takeможет быть представлен как применение «изящной» индексации к каждому 1-мерному срезу:Ni, Nk = a.shape[:axis], a.shape[axis+1:] for ii in ndindex(Ni): for kk in ndindex(Nj): out[ii + s_[...,] + kk] = a[ii + s_[:,] + kk][indices]По этой причине он эквивалентен (но быстрее), чем следующее использование
apply_along_axis:out = np.apply_along_axis(lambda a_1d: a_1d[indices], axis, a)
Примеры
>>> a = [4, 3, 5, 7, 6, 8] >>> indices = [0, 1, 4] >>> np.take(a, indices) array([4, 3, 6])
В этом примере, если
aявляется ndarray, можно использовать «изящную» индексацию.>>> a = np.array(a) >>> a[indices] array([4, 3, 6])
Если
indicesне одномерный, выходной массив также имеет эти измерения.>>> np.take(a, [[0, 1], [2, 3]]) array([[4, 3], [5, 7]])
© 2005–2022 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/1.21/reference/generated/numpy.take.html