NumPy
NumPy (сокращение от Numerical Python) — это библиотека с открытым исходным кодом для языка программирования Python, предназначенная для выполнения научных и инженерных вычислений. Она предоставляет поддержку многомерных массивов и матриц (объект ndarray), а также обширный набор высокоуровневых математических функций для эффективной работы с этими структурами данных. NumPy является фундаментальной основой для многих других библиотек научного стека Python, таких как SciPy, Matplotlib, Pandas и scikit-learn.
История
Разработка NumPy началась в 2005 году как объединение двух проектов: Numeric (созданного Джимом Хьюгининым в 1995 году) и Numarray (разработанного Грин Робинсоном и другими в 2001 году). Основной целью слияния было создание единой, более мощной и гибкой библиотеки, которая объединила бы лучшие черты обоих предшественников. Проект возглавил Трэвис Олифант, который и является основным автором NumPy. Первый стабильный релиз (NumPy 1.0) состоялся в 2006 году. С тех пор библиотека активно развивается сообществом, регулярно выходят новые версии с улучшениями производительности, новыми функциями и исправлениями ошибок.
Ключевые характеристики и устройство
Основной объект: ndarray
Центральным элементом NumPy является n-мерный массив (ndarray). В отличие от стандартных списков Python, ndarray обладает рядом критических преимуществ:
- Однородность типов: Все элементы массива имеют один и тот же тип данных (например,
int32,float64,complex128). Это позволяет хранить данные в памяти компактно и выполнять операции над ними с максимальной эффективностью. - Фиксированный размер: Размер массива задаётся при создании и не может быть изменён (хотя можно создать новый массив на основе старого).
- Векторизация: Операции применяются ко всем элементам массива сразу, без необходимости явного написания циклов на Python. Это значительно ускоряет вычисления, так как внутренняя реализация NumPy написана на C и Fortran.
- Широковещание (Broadcasting): Возможность выполнять арифметические операции между массивами разной формы, причём меньший массив «растягивается» до размеров большего без фактического копирования данных.
Типы данных (dtype)
NumPy поддерживает множество числовых типов данных, включая:
- Целочисленные:
int8,int16,int32,int64,uint8,uint16,uint32,uint64. - Числа с плавающей точкой:
float16,float32,float64(аналогdoubleв C),float128. - Комплексные числа:
complex64,complex128,complex256. - Логический:
bool. - Строковый:
str_. - Пользовательские типы данных.
Индексация и нарезка (Slicing)
NumPy предоставляет мощные средства для доступа к элементам массива:
- Целочисленная индексация:
arr[i, j]. - Нарезка:
arr[start:stop:step]для получения подмассива (возвращается представление, а не копия данных, если это возможно). - Булева индексация: Использование массива логических значений для выбора элементов, удовлетворяющих условию.
- Фантазийная индексация: Использование массива целочисленных индексов для выбора произвольных элементов.
Функциональные возможности
NumPy включает в себя обширный набор функций, которые можно условно разделить на несколько категорий:
Создание массивов
np.array(): из списка или кортежа Python.np.zeros(),np.ones(),np.full(): массивы, заполненные нулями, единицами или заданным значением.np.arange(): массив с равномерным шагом (аналогrange()).np.linspace(): массив с заданным количеством точек между началом и концом.np.random.rand(),np.random.randn(),np.random.randint(): массивы со случайными числами.np.eye(),np.identity(): единичные матрицы.
Математические операции
- Поэлементные операции: сложение, вычитание, умножение, деление, возведение в степень, тригонометрические функции (
sin,cos,tan), экспонента (exp), логарифмы (log,log10). - Линейная алгебра (подмодуль
linalg): умножение матриц (dot,matmul), вычисление определителя (det), обратной матрицы (inv), собственных значений и векторов (eig), решение систем линейных уравнений (solve). - Статистика: среднее (
mean), медиана (median), стандартное отклонение (std), дисперсия (var), минимум, максимум (min,max), сумма (sum), произведение (prod). - Преобразование Фурье (подмодуль
fft): быстрое преобразование Фурье и его обратное. - Полиномы (подмодуль
polynomial): работа с полиномиальными функциями.
Манипуляции с формой и размерностью
reshape(): изменение формы массива без изменения данных.resize(): изменение формы массива с возможным копированием данных.flatten(),ravel(): превращение многомерного массива в одномерный (первый создаёт копию, второй — представление).transpose(),.T: транспонирование.concatenate(),vstack(),hstack(): объединение массивов.split(),hsplit(),vsplit(): разделение массивов на части.
Ввод/вывод данных
NumPy поддерживает сохранение и загрузку массивов в нескольких форматах:
- Бинарные форматы:
.npy(один массив) и.npz(несколько массивов в одном архиве) с использованием функцийnp.save(),np.load(),np.savez(). - Текстовые форматы:
np.loadtxt(),np.savetxt()для работы с файлами CSV, TSV и другими текстовыми файлами.
Применение
NumPy является незаменимым инструментом во многих областях науки и техники:
- Научные вычисления: Моделирование физических процессов, обработка экспериментальных данных, численное решение дифференциальных уравнений.
- Машинное обучение и искусственный интеллект: NumPy лежит в основе большинства фреймворков глубокого обучения (TensorFlow, PyTorch, JAX) и библиотек для классического машинного обучения (scikit-learn). Он используется для представления данных (матрицы признаков, векторы меток) и реализации алгоритмов.
- Обработка изображений и сигналов: Изображения представляются в виде многомерных массивов (пиксели), что позволяет применять к ним фильтры, преобразования и другие операции.
- Финансовая инженерия: Анализ временных рядов, оценка рисков, моделирование цен активов.
- Геофизика и астрономия: Обработка данных наблюдений, моделирование геологических и астрофизических процессов.
Производительность и оптимизация
Высокая производительность NumPy достигается за счёт нескольких факторов:
- Реализация на C и Fortran: Критические внутренние циклы написаны на компилируемых языках, что обеспечивает скорость, сравнимую с C или Fortran.
- Векторизация: Операции над массивами выполняются с помощью оптимизированных библиотек линейной алгебры, таких как BLAS и LAPACK (например, OpenBLAS, Intel MKL).
- Управление памятью: Массивы хранятся в непрерывных блоках памяти, что улучшает кэширование и скорость доступа.
Критика и ограничения
Несмотря на свою мощь, NumPy имеет некоторые ограничения:
- Фиксированный размер массива: Изменение размера требует создания нового массива, что может быть неэффективно для задач, где размер данных постоянно меняется.
- Однородность типов: Необходимость хранения данных одного типа может быть неудобной для гетерогенных данных (где лучше подходят Pandas DataFrames или структурированные массивы NumPy).
- Сложность отладки: Ошибки, связанные с формой массивов или типами данных, могут быть трудны для обнаружения, особенно в больших программах.
- Отсутствие встроенной поддержки GPU: NumPy работает только на CPU. Для вычислений на GPU используются специализированные библиотеки, такие как CuPy или JAX.
Интересные факты
- Название «NumPy» является аббревиатурой от «Numerical Python».
- NumPy является одним из наиболее загружаемых пакетов на PyPI (Python Package Index) с миллионами загрузок в месяц.
- Многие другие популярные библиотеки Python, такие как Pandas, SciPy, Matplotlib и scikit-learn, используют NumPy в качестве своей основы.
- Разработка NumPy финансируется различными организациями, включая Национальный научный фонд США (NSF) и компанию Enthought.
Источники
- Oliphant, T. E. (2006). A guide to NumPy. Trelgol Publishing.
- Документация NumPy. NumPy Reference Guide.
- Harris, C. R., Millman, K. J., van der Walt, S. J., et al. (2020). Array programming with NumPy. Nature, 585(7825), 357–362.
- Ван дер Вальт, С., Кольберт, С., & Варокво, Г. (2011). The NumPy array: a structure for efficient numerical computation. Computing in Science & Engineering, 13(2), 22–30.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →