Расширенная индексация
Базовые срезы хорошо работают для непрерывных областей, но иногда вам нужны более сложные выборки. NumPy предоставляет две мощные техники расширенной индексации:
Индексация массивом целых чисел
Выбирайте произвольные элементы, предоставляя массив индексов. Это похоже на выбор конкретных элементов из списка по их позициям.
Пример из реальной жизни: У вас есть оценки за тесты, и вы хотите проверить оценки студентов на позициях 3, 7 и 12:
scores = np.array([85, 92, 78, 95, 88, 76, 91, 89, 84, 93, 87, 90, 82])
student_positions = [3, 7, 12] ## Студенты, которые вас интересуют
selected_scores = scores[student_positions] ## [95, 89, 82]
Индексация булевым массивом (маскирование)
Выбирайте элементы на основе условий. Создайте "маску" из значений True/False, затем используйте ее для фильтрации массива.
Пример из реальной жизни: Отфильтруйте проходные оценки (≥ 80) из класса:
scores = np.array([85, 92, 78, 95, 88, 76, 91, 89, 84, 93])
passing_mask = scores >= 80 ## [True, True, False, True, True, False, True, True, True, True]
passing_scores = scores[passing_mask] ## [85, 92, 95, 88, 91, 89, 84, 93]
Почему это важно
- Индексация целыми числами: Идеально подходит для выборки конкретных точек данных
- Булева индексация: Идеально подходит для фильтрации данных и условного выбора
- Оба метода создают копии (не представления), поэтому изменения не влияют на исходный массив
Давайте попробуем оба. Замените содержимое indexing_practice.py следующим кодом:
import numpy as np
## --- Индексация массивом целых чисел ---
x = np.arange(10, 0, -1)
print("Array for integer indexing:", x)
## Выбираем элементы по индексам 3, 3, 1 и 8
selected_elements = x[np.array([3, 3, 1, 8])]
print("Selected elements with integer array:", selected_elements)
## --- Индексация булевым массивом ---
y = np.array([1., -1., -2., 3.])
print("\nArray for boolean indexing:", y)
## Создаем булеву маску для отрицательных элементов
mask = y < 0
print("Boolean mask (y < 0):", mask)
## Выбираем элементы, где условие истинно (True)
negative_elements = y[mask]
print("Elements where y < 0:", negative_elements)
Сохраните файл и запустите скрипт:
python indexing_practice.py
Ваш вывод должен продемонстрировать, как работают как целочисленная, так и булева индексация для выбора конкретных данных из ваших массивов.
Array for integer indexing: [10 9 8 7 6 5 4 3 2 1]
Selected elements with integer array: [7 7 9 2]
Array for boolean indexing: [ 1. -1. -2. 3.]
Boolean mask (y < 0): [False True True False]
Elements where y < 0: [-1. -2.]