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