Перейти к содержимому
Теория · NumPy и pandas · урок 3 из 12

Индексы и срезы

Из таблицы данных почти всегда нужна только часть: один столбец, первые строки, объекты с ценой выше порога. Массив numpy отдаёт такие части по индексам, как список, но умеет и больше:

Python
import numpy as np

a = np.array([120, 95, 300, 210, 80])
print(a[0], a[-1])  # 120 80
print(a[1:3])  # [ 95 300]
print(a[:2], a[3:])  # [120  95] [210  80]

Индекс 0 — первый элемент, -1 — последний. Срез (slice) a[1:3] берёт элементы с индекса 1 до индекса 3, не включая его. Пропущенное начало значит «с первого элемента», пропущенный конец — «до последнего». Срез массива — тоже массив, и у него есть те же shape, sum и mean.

Строки и столбцы

У двумерного массива два индекса через запятую: сначала строка, затем столбец. Двоеточие вместо индекса значит «все»: X[:, 1] — все строки второго столбца. Срез строк сохраняет все столбцы, поэтому X[1:] — таблица без первой строки.

Python
X = np.array([[1.5, 20.0], [2.0, 35.0], [0.5, 12.0]])
print(X[1, 0])  # 2.0
print(X[:, 1])  # [20. 35. 12.]
print(X[1:].shape)  # (2, 2)

В машинном обучении строка обычно — объект, а столбец — признак (feature). Поэтому X[:, 1] читается как «второй признак у всех объектов». Срез и индекс можно сочетать: X[:2, 1] — второй признак первых двух объектов.

Булева маска

Сравнение массива с числом выполняется для каждого элемента и даёт массив из True и False. Такой массив называют булевой маской (boolean mask). Если передать маску вместо индекса, останутся элементы, напротив которых стоит True:

Python
mask = a > 100
print(mask)  # [ True False  True  True False]
print(a[mask])  # [120 300 210]
print(mask.sum(), a[mask].sum())  # 3 630
print(a[(a > 100) & (a < 250)])  # [120 210]

Маска сохраняет порядок: a[mask] перечисляет подходящие значения так, как они стояли в a. Сумма маски считает True как 1, а False как 0. Поэтому mask.sum() — число подходящих элементов, а a[mask].sum() — сумма их значений.

Два условия объединяет оператор & («и»). Каждое сравнение берут в скобки: без них выражение вызывает ValueError.

Частая ошибка

Первый признак взяли одним индексом:

Python
first_feature = X[0]  # ✗
print(first_feature)  # [ 1.5 20. ]

Python не сообщает об ошибке, но X[0] — первая строка, то есть все признаки первого объекта. Первый индекс всегда выбирает строки, даже когда второй не указан. Первый признак у всех объектов — это X[:, 0].

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом