Spec-Zone.ru › NumPy 2.0

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–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/generated/numpy.take.html

Spec-Zone.ru

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