Индексы и срезы
Из таблицы данных почти всегда нужна только часть: один столбец, первые строки, объекты с ценой выше порога. Массив numpy отдаёт такие части по индексам, как список, но умеет и больше:
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:] — таблица без первой строки.
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:
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.
Частая ошибка
Первый признак взяли одним индексом:
first_feature = X[0] # ✗
print(first_feature) # [ 1.5 20. ]Python не сообщает об ошибке, но X[0] — первая строка, то есть все признаки первого объекта. Первый индекс всегда выбирает строки, даже когда второй не указан. Первый признак у всех объектов — это X[:, 0].
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.