Рубрики
Без рубрики

Numpy: продвижение индексации

В этом блоге мы говорим о различных способах индексации массива в Numpy, которые удивительны …. Помечено Python, Numpy, Array, индексирование.

В этом блоге мы говорим о различных способах индексации массива в Numpy, которые удивительны.

Основные нарезки и индексирование

Итак, здесь от базовой нарезки и индексации мы говорим о Pythons Basic Conception Щит и индексации, которая похожа на встроенный тип данных Python корпус , Список и ул ...| Отказ

Для доступа к одному элементу из NUMPY MARY мы можем сделать это, передавая прохождение каждого индекса измерения, в которых, в частности, с помощью , в [] Потому что Numpy поддерживает многоразмерную индексацию. Например: [1,2] [1] [2] Отказ Мы можем пройти значение индекса либо позитивным началом с 0 (который является первым элементом) или отрицательным, где -1 означает последний элемент массива.

Для доступа к доступу доступа к одному элементу, мы можем использовать стандартный синтаксис нарезки Python на базу измерений всех разделенных с , в квадратный кронштейн.

Базовый синтаксис ломтика в I: J: K Где я начинаю индекс, J – останавливая индекс, а K – это шаги.

>>> import numpy as np
>>> ## Accessing a single element:
>>> # 1. from 1-D array:
>>> arr = np.arange(10)
>>> arr[0]
 0
>>> arr[-2]
 8
>>> #2. from 2-D array:
>>> nd_arr = np.array([[1,2,3],
...               [4,5,6],
...               [7,8,9]])
>>> nd_arr[1,2]
 6
>>> nd_arr[-1,2]
 9
>>> ## accessing more then one element:
>>> # for 1-D array:
>>> arr[1:5:2]
array([1, 3])
>>> # for 2-D array:
>>> nd_arr[0:2:1,:]
array([[1, 2, 3],
       [4, 5, 6]])
>>> #this can also be achieved by '...':
>>> nd_arr[0:2:1,...]
array([[1, 2, 3],
       [4, 5, 6]])

Эллипсис («...») расширяется до количества : Объекты, необходимые для подбора кортежа, чтобы индексировать все размеры. В большинстве случаев это означает, что длина расширенного подбора кортеля Arr.ndim Отказ Там может быть только один эллипсовый присутствующий.

Эллипсис Является встроенным постоянным типом Python, который в основном используется в сочетании с расширенным синтаксисом нарезка для пользовательских типов данных контейнера.

Авансовая индексация в Numpy Array

Предварительная индексация означает, когда объект выбора является объектом NOUTUTLE, NDARRAY of INT или BOOL, или кортеж с ALEMELEL OBLE SEQUENGE с типом данных INT или BOOL. Существует два типа авансовой индексации, одно целое число и другое логическое.

В Numpy, Расширенная индексация всегда возвращает копию данных во время Основные нарезки Возвращает вид.

Одна самая важная вещь, что определение расширенной индексации означает, что х [(1,2,3),] принципиально отличается от х [(1,2,3)] . Последнее эквивалентно х [1,2,3] который будет вызвать базовый выбор, в то время как первый будет вызвать расширенную индексацию. Обязательно понять, почему это происходит.

Также признать, что х [[1,2,3]] будет вызвать расширенную индексацию

Индексирование целочисленного массива

Индексирование целочисленного массива позволяет выбирать произвольные элементы в массиве на основе их N-мерного индекса. Каждый целочисленный массив представляет ряд индексов в этот размер.

Чисто целочисленная индексация массива

Когда индекс состоит из того, что многие целочисленные массивы, поскольку индексируемый массив имеет размеры, индексирование проходит прямо, но отличается от нарезки.

>>> #Example:
>>> x = np.array([[1, 2], [3, 4], [5, 6]])
>>> x[[0, 1, 2], [0, 1, 0]]
array([1, 4, 5])
>>> #Example
>>> x = np.array([[ 0,  1,  2],
...           [ 3,  4,  5],
...           [ 6,  7,  8],
...           [ 9, 10, 11]])
>>> rows = np.array([[0, 0],[3, 3]], dtype=np.intp)
>>> columns = np.array([[0, 2],[0, 2]], dtype=np.intp)
>>> x[rows, columns]
array([[ 0,  2],
       [ 9, 11]])

Предварительные индексы всегда транслируются и итерацией, как один. В результате мы получаем аналогичное измерение вещательного результата.

В приведенном выше примере мы транслируемся в рядах и столбце, но в Numpy есть одна функция IX_ которые помогают этому вещанию.

>>> #Example
>>> x = np.array([[ 0,  1,  2],
...           [ 3,  4,  5],
...           [ 6,  7,  8],
...           [ 9, 10, 11]])

>>> rows = np.array([0, 3], dtype=np.intp)
>>> columns = np.array([0, 2], dtype=np.intp)

>>> x[np.ix_(rows, columns)]
array([[ 0,  2],
       [ 9, 11]])
>>> # if we don't use `np.ix_` then result:
>>> x[rows, columns]
array([ 0, 11])

Сочетание продвинутой и базовой индексации

Когда есть хотя бы один Ломтик (:) , эллипсис (...) или newaxis В индексе (или массив имеет больше измерений, чем продвинутые индексы), то поведение может быть более сложным. Это похоже на объединение индексации результата для каждого расширенного элемента индекса

>>> x[1:2,1:3]
array([[4, 5]])
>>> x[1:2,[1,2]]
array([[4, 5]])

Булевая индексация массива

Этот типов индексации возникает, когда объект выбора является массивом логика, например, возвращенные из оператора сравнения.

Если размерность выбранного объекта такой же, как массив, то он возвращает 1-D массив, заполненный всем результатом, соответствующим Правда ценность . Порядок поиска будет Row-Major , C-стиль Отказ

Если у Obj есть Правда Значения на записях, которые находятся за пределами границ х Тогда Ошибка индекса будет поднят. Если obj меньше чем х Он идентичен, чтобы заполнить его Ложь Отказ

>>> #Example:
>>> x = np.array([[1., 2.], [np.nan, 3.], [np.nan, np.nan]])
>>> x[~np.isnan(x)]
array([1., 2., 3.])
>>> #Example:
>>> x = np.array([1., -1., -2., 3])
>>> x[x < 0] += 20
>>> x
array([ 1., 19., 18.,  3.])
>>> #Example : use with basic indexing
>>> x = np.array([[0, 1], [1, 1], [2, 2]])
>>> rowsum = x.sum(-1)
>>> x[rowsum <= 2, :]
array([[0, 1],
       [1, 1]])
>>> #Example : use with np.ix_
>>> x = np.array([[ 0,  1,  2],
...           [ 3,  4,  5],
...           [ 6,  7,  8],
...           [ 9, 10, 11]])
>>> rows = (x.sum(-1) % 2) == 0
>>> columns = [0, 2]

>>> x[np.ix_(rows, columns)]
array([[ 3,  5],
       [ 9, 11]])

Доступ к полю:

Если объект NDARRAY представляет собой структурированный массив, полей массива можно получить доступ, индексируя массив с строками, словарь-словарь.

Индексирование X ['Имя поля'] Возвращает новый вид на массив.

Если доступовое поле представляет собой суб-массив, размеры суб-массива прилагаются к форме результата.

>>> x = np.zeros((2,2), dtype=[('a', np.int32), ('b', np.float64,(3,3))])

>>> x['a']
array([[0, 0],
       [0, 0]])
>>> x['b']
array([[[[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]],

         [[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]]],


       [[[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]],

        [[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]]]])

Плоская итераторная индексация

x.flat Возвращает итератор, который произойдет во всем массиве (в C-непрерывном стиле с последним индексом, варьирующимся самым быстрым). Этот объект ITERATOR также может быть проиндексирован с использованием базовой нарезки или расширенной индексации, если объект выбора не является кортежным. Это должно быть понятно от того, что X.FLAT представляет собой одномерное представление. Его можно использовать для целочисленного индексации с 1-мерным C-стиль-плоские индексы Отказ Поэтому форма любого возвращенного массива является формой целочисленного объекта индексации.

>>> x = np.arange(1, 7).reshape(2, 3)
>>> x
array([[1, 2, 3],
       [4, 5, 6]])
>>> x.flat[3]
4
>>> x.T
array([[1, 4],
       [2, 5],
       [3, 6]])
>>> x.T.flat[3]
5
>>> type(x.flat)
numpy.flatiter

>>> #assignment example
>>> x.flat = 3
>>> x
array([[3, 3, 3],
       [3, 3, 3]])
>>> #assignment example

>>> x.flat[[1,4]] = 1
>>> x
array([[3, 1, 3],
       [3, 1, 3]])

Оригинал: “https://dev.to/cdaman123/numpy-advance-indexing-16o6”