Spec-Zone.ru › NumPy 1.17

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]
Параметры:
a : array_like (Ni…, M, Nk…)

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

indices : array_like (Nj…)

Индексы значений для извлечения.

Введено в версии 1.8.0.

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

axis : int, optional

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

out : ndarray, optional (Ni…, Nj…, Nk…)

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

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

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

  • ‘raise’ – генерировать ошибку (по умолчанию)
  • ‘wrap’ – циклический сдвиг
  • ‘clip’ – ограничение до диапазона

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

Возвращает:
out : ndarray (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–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.17.0/reference/generated/numpy.take.html

Spec-Zone.ru

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