В этом блоге мы говорим о различных способах индексации массива в 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”