numpy.take#

numpy.take(a, индексы, ось=None, выход=None, mode='raise')[источник]#

Взять элементы из массива вдоль оси.

Когда ось не 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…)

Исходный массив.

индексыarray_like (Nj…)

Индексы значений для извлечения. Также допускаются скаляры в качестве индексов.

осьint, необязательный

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

выходndarray, опционально (Ni…, Nj…, Nk…)

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

mode{‘raise’, ‘wrap’, ‘clip’}, опционально

Определяет поведение индексов вне границ.

  • 'raise' – вызвать ошибку (по умолчанию)

  • ‘wrap’ – циклический перенос

  • ‘clip’ – обрезать до диапазона

Режим 'clip' означает, что все индексы, которые слишком велики, заменяются индексом, адресующим последний элемент вдоль этой оси. Обратите внимание, что это отключает индексирование с отрицательными числами.

Возвращает:
выходndarray (Ni…, Nj…, Nk…)

Возвращаемый массив имеет тот же тип, что и a.

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

compress

Взятие элементов с использованием булевой маски

ndarray.take

эквивалентный метод

take_along_axis

Взять элементы, сопоставляя массив и массивы индексов

Примечания

Устраняя внутренний цикл в описании выше и используя s_ для создания простых объектов среза, take может быть выражено в терминах применения расширенной индексации к каждому одномерному срезу:

Ni, Nk = a.shape[:axis], a.shape[axis+1:]
for ii in ndindex(Ni):
    for kk in ndindex(Nk):
        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)

Примеры

>>> import numpy as np
>>> 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]])