Введение в индексирование в NumPy

NumPyNumPyBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии мы изучим основы индексирования в NumPy. Индексирование позволяет нам получать доступ к и манипулировать конкретными элементами или подмножествами элементов в массиве. Разумение, как эффективно использовать индексирование, является важным аспектом при работе с массивами в NumPy.

Примечание: Вы можете писать код в 02-indexing-on-ndarrays.ipynb. В некоторых шагах некоторые операции вывода опущены, и вы можете выводить результат по необходимости.

Импортируем NumPy

Сначала импортируем библиотеку NumPy, чтобы иметь возможность использовать ее функции и типы данных.

import numpy as np

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

Массивы NumPy можно индексировать с использованием стандартного синтаксиса Python x[obj], где x - это массив, а obj - это выборка. Существует несколько типов индексирования, в зависимости от типа obj.

Индексирование одного элемента

Индексирование одного элемента работает точно так же, как индексирование для других стандартных последовательностей Python. Нумерация начинается с 0, и допускаются отрицательные индексы для индексирования с конца массива.

x = np.arange(10)
print(x[2])  ## Вывод: 2
print(x[-2])  ## Вывод: 8

Многомерное индексирование

Массивы могут иметь несколько измерений, и индексирование работает одинаково для каждого измерения. Вы можете получить доступ к элементам в многомерном массиве, разделяя индекс каждого измерения запятой.

x = np.arange(10).reshape(2, 5)
print(x[1, 3])  ## Вывод: 8
print(x[1, -1])  ## Вывод: 9

Индексирование подмассива

Если вы индексируете многомерный массив меньшим количеством индексов, чем измерений, вы получаете подмассив. Каждый указанный индекс выбирает массив, соответствующий оставшимся измерениям.

x = np.arange(10).reshape(2, 5)
print(x[0])  ## Вывод: [0, 1, 2, 3, 4]

Слайсинг и跨步 (Striding)

Базовый слайсинг в NumPy расширяет концепцию слайсинга Python до N измерений. Это позволяет вам выбирать диапазон элементов вдоль каждого измерения массива.

Базовый слайсинг

Базовый слайсинг происходит, когда obj является объектом среза (создается с использованием записи start:stop:step внутри квадратных скобок), целым числом или кортежем из объектов срезов и целых чисел.

x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(x[1:7:2])  ## Вывод: [1, 3, 5]

Отрицательные индексы

Отрицательные индексы можно использовать для индексирования с конца массива. Например, -1 ссылается на последний элемент, -2 на предпоследний элемент и так далее.

x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(x[-2:10])  ## Вывод: [8, 9]
print(x[-3:3:-1])  ## Вывод: [7, 6, 5, 4]

По умолчанию значения для слайсинга

Если начальный индекс не указан, по умолчанию он равен 0 для положительных значений шага и -n-1 для отрицательных значений шага. Если конечный индекс не указан, по умолчанию он равен n для положительных значений шага и -n-1 для отрицательных значений шага. Если шаг не указан, по умолчанию он равен 1.

x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(x[5:])  ## Вывод: [5, 6, 7, 8, 9]

Расширенное индексирование

Расширенное индексирование срабатывает, когда объект выбора obj является не кортежным последовательным объектом, ndarray (с целочисленным или булевым типом данных), или кортежем, содержащим по крайней мере один последовательный объект или ndarray (с целочисленным или булевым типом данных). Существует два типа расширенного индексирования: целочисленное и булевое.

Целочисленное индексирование массивов

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

x = np.arange(10, 1, -1)
print(x[np.array([3, 3, 1, 8])])  ## Вывод: [7, 7, 9, 2]
print(x[np.array([3, 3, -3, 8])])  ## Вывод: [7, 7, 4, 2]

Булевое индексирование массивов

Булевое индексирование массивов позволяет выбирать элементы массива на основе булевого условия. Результатом является новый массив, содержащий только элементы, соответствующие True значениям булевого массива.

x = np.array([1., -1., -2., 3])
x[x < 0] += 20
print(x)  ## Вывод: [ 1., 19., 18., 3.]

Доступ к полям

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

x = np.array([(1, 2), (3, 4), (5, 6)], dtype=[('a', np.int32), ('b', np.int32)])
print(x['a'])  ## Вывод: [1, 3, 5]

Индексирование с использованием плоского итератора

Атрибут x.flat возвращает итератор, который можно использовать для перебора всего массива в стиле C-последовательного хранения. Этот итератор также можно индексировать с использованием базового слайсинга или расширенного индексирования.

x = np.arange(10)
iterator = x.flat
print(iterator[1:5])  ## Вывод: [1, 2, 3, 4]

Присваивание значений индексированным массивам

Вы можете присваивать значения определенным элементам или подмножествам элементов в массиве с использованием индексирования. Значение, которое присваивается, должно иметь совместимую форму с индексированным массивом.

x = np.arange(10)
x[2:7] = 1
print(x)  ## Вывод: [0, 1, 1, 1, 1, 1, 7, 8, 9]

x = np.arange(10)
x[2:7] = np.arange(5)
print(x)  ## Вывод: [0, 1, 0, 1, 2, 3, 7, 8, 9]

Резюме

В этом практическом занятии мы изучили основы индексирования в NumPy. Мы узнали, как использовать базовое индексирование, слайсинг, расширенное индексирование, доступ к полям, индексирование с использованием плоского итератора и присвоение значений индексированным массивам. Понимание этих техник индексирования необходимо для эффективной работы с массивами в NumPy.