Тысячи порогов без матрицы сравнений: searchsorted и границы

Для каждого события нужно определить тарифную ступень среди отсортированных порогов. Сравнение values[:, None] >= thresholds создаёт матрицу: число событий умножается на число границ. При росте справочника промежуточный массив становится главным потребителем памяти, хотя результату нужен один номер на событие.

searchsorted находит место вставки в отсортированном массиве. Для классификации это число пройденных порогов. Параметр side определяет, в какую сторону попадёт значение, ровно равное границе; его выбор должен соответствовать договору тарификации.

Как изменить решение

import numpy as np
thresholds = np.array([100., 500., 1000.])
values = np.array([99., 100., 499., 500., 1001.])
tier = np.searchsorted(thresholds, values, side='right')
assert tier.tolist() == [0, 1, 1, 2, 3]
reference = (values[:, None] >= thresholds).sum(axis=1)
assert np.array_equal(tier, reference)
print(tier)

Ровно 100 уже относится к ступени 1, а ровно 500 — к ступени 2. Всего три порога задают четыре ступени, поэтому результат может равняться длине thresholds. Это не всегда допустимый индекс массива ставок, пока ставки не описаны для всех интервалов.

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

Что проверить на своих данных

После установки NumPy запустите пример и измените side на left. Сравните только элементы на точных границах: именно они покажут различие. Для промышленной функции добавьте проверку np.diff(thresholds) > 0, допустимости значений и поведения при пустом справочнике.

NaN лучше вынести в отдельную маску до классификации. Техническое место вставки неизвестного измерения не является тарифной категорией. Если нужны подписи интервалов и работа с пропусками в таблице, pd.cut может быть удобнее, но для большого числового массива searchsorted даёт прямой контроль над выходной формой. Маленькая матрица из примера полезна как эталон в тесте, а не как основной способ обработки миллионов событий.

Практика дальше

Чтобы уверенно выбирать между векторными операциями, полезно закрепить формы и индексацию массивов. Тренажёр «NumPy и pandas» даёт задачи на маски, broadcasting и вычисления без циклов. Затем эти приёмы используются в обработке заказов и клиентском отчёте.

Посмотреть программу и практику курса

Источник: Тысячи порогов без матрицы сравнений — официальная документация.

Другие задачи по теме: Календарь, пропуски и точность вычислений.

Продолжить на практике

  • NumPy и pandas: практический тренажёр ↗

    Бесплатный тренажёр NumPy и pandas для тех, кто знает основы Python. Научитесь очищать таблицы, объединять данные и собирать отчёты: 31 урок и 124 задачи с кодом и автоматической проверкой.