Spec-Zone.ru › NumPy 1.18

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, optional

Ось, по которой выбираются значения. По умолчанию используется уплощённый входной массив.

outndarray, optional (Ni…, Nj…, Nk…)

Если указано, результат будет помещён в этот массив. Он должен иметь соответствующую форму и тип данных. Обратите внимание, что out всегда буферизуется, если mode=’raise’; для лучшей производительности используйте другие режимы.

mode{‘raise’, ‘wrap’, ‘clip’}, optional

Определяет, как будут обрабатываться индексы за пределами границ.

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

Spec-Zone.ru

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