Spec-Zone.ru › NumPy 1.21

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

Spec-Zone.ru

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