July 29, 2021

Сюрпризы типов данных NumPy, о которых следует знать аналитику

Работа с данными в NumPy сулит много преимуществ, но одновременно таит в себе тайны, незнание которых может привести к неприятным проблемам.

Так, к их числу относится работа со строками, на хранение которых NumPy выделяет определенную квоту, соответственно, ее превышение может привести к обрезанию. Вы не увидите ошибки, а просто получите некорректное значение, что опаснее по своим последствиям.

Так, создадим массив строк, попробуем изменить последний элемент и посмотрим на результат:

Как можно заметить, по умолчанию массиву присвоен dtype="<U4", определяющий порядок хранения байтов, тип и размер. U4 - unicode строка из 4 символов. Как следствие, попытка добавления в начало последнего элемента "0" к цели не приводит (происходит обрезание элемента).

Исправить ошибку можно увеличив максимальный размер строк, явно указав тип:

Альтернативным способом является задание типа object, который позволяет работать с массивом NumPy как со списком обычных объектов Python:

Однако это нивелирует преимущества быстрой обработки массивов в NumPy. В свою очередь, работа с объектами Python добавляет много накладных расходов. Убедиться в этом легко на примере арифметических операций: