Введение

Библиотека Python для численного программирования

NumPy (произносится /ˈnʌm.paɪ/ NUMpy) — это библиотека для языка программирования Python, добавляющая поддержку больших многомерных массивов и матриц, а также обширную коллекцию математических функций высокого уровня для работы с этими массивами. Предшественник NumPy, Numeric, был первоначально создан Джимом Хугунином при участии других разработчиков. В 2005 году Трэвис Олифант создал NumPy, объединив в Numeric возможности конкурирующего Numarray с существенными изменениями. NumPy является программным обеспечением с открытым исходным кодом и имеет множество участников. NumPy — это проект, поддерживаемый NumFOCUS.

матрица-сиг

Язык программирования Python изначально не был разработан для численных вычислений, но довольно быстро привлек внимание научного и инженерного сообщества. В 1995 году была основана специальная группа интересов (SIG) matrix sig с целью разработки пакета для работы с массивами; среди ее членов был разработчик и сопровождающий Python Гидо ван Россум, который расширил синтаксис Python (в частности, синтаксис индексирования), чтобы упростить вычисления с массивами. (также известный как "расширения Numerical Python" или "NumPy"), испытывая влияние от семейства языков APL, Basis, MATLAB, FORTRAN, S и S+, а также других. Хьюгинин, аспирант Массачусетского технологического института (MIT), отмечал, что Numarray обеспечивал более высокую скорость операций с большими массивами, но был медленнее, чем Numeric при работе с малыми, поэтому некоторое время оба пакета использовались параллельно для различных задач. Последняя версия Numeric (v24.2) была выпущена 11 ноября 2005 года, а последняя версия numarray (v1.5.2) – 24 августа 2006 года. Существовало стремление включить Numeric в стандартную библиотеку Python, но Гидо ван Россум решил, что в текущем состоянии код было сложно поддерживать.

Число

В начале 2005 года разработчик NumPy Трэвис Олифант стремился объединить сообщество вокруг единого пакета для работы с массивами и перенёс функциональность Numarray в Numeric, выпустив результат под названием NumPy 1.0 в 2006 году. В 2011 году PyPy приступил к разработке реализации API NumPy для PyPy. По состоянию на 2023 год она ещё не полностью совместима с NumPy.

Особенности

NumPy ориентирован на референсную реализацию CPython языка Python, являющуюся неоптимизирующим интерпретатором байт-кода. Математические алгоритмы, написанные для этой версии Python, часто работают значительно медленнее, чем компилируемые аналоги из-за отсутствия оптимизации компилятора. NumPy частично решает проблему медлительности, предоставляя многомерные массивы, а также функции и операторы, эффективно работающие с массивами; для их использования требуется переписать часть кода, в основном внутренние циклы, с применением NumPy. Использование NumPy в Python обеспечивает функциональность, сопоставимую с MATLAB, поскольку оба языка являются интерпретируемыми и позволяют пользователю создавать быстрые программы, если большинство операций выполняются над массивами или матрицами, а не скалярами. В отличие от этого, MATLAB располагает большим количеством дополнительных тулбоксов, в частности Simulink, в то время как NumPy тесно интегрирован с Python – более современным и полноценным языком программирования. Кроме того, доступны дополнительные пакеты для Python: SciPy – библиотека, добавляющая функциональность, аналогичную MATLAB, а Matplotlib – пакет для построения графиков, предоставляющий возможности, сопоставимые с MATLAB. Хотя MATLAB может выполнять операции с разреженными матрицами, NumPy самостоятельно не поддерживает такие операции и требует использования библиотеки scipy.sparse. Внутренне и MATLAB, и NumPy используют BLAS и LAPACK для эффективных вычислений в линейной алгебре. Python-обвязки широко используемой библиотеки компьютерного зрения OpenCV используют массивы NumPy для хранения и обработки данных. Поскольку изображения с несколькими каналами просто представляются в виде трехмерных массивов, индексация, нарезка или маскировка с помощью других массивов являются очень эффективными способами доступа к конкретным пикселям изображения. Массив NumPy, как универсальная структура данных в OpenCV для изображений, выделенных ключевых точек, ядер фильтров и многого другого, значительно упрощает рабочий процесс программирования и отладки. Важно отметить, что многие операции NumPy освобождают глобальную блокировку интерпретатора (GIL), что позволяет осуществлять многопоточную обработку. NumPy также предоставляет C API, позволяющее коду Python взаимодействовать с внешними библиотеками, написанными на языках низкого уровня.

Структура данных n-ареа

Основная функциональность NumPy – это его "ndarray", структура данных для n-мерных массивов. Эти массивы представляют собой просматриваемые участки памяти. В отличие от встроенной структуры данных списка Python, эти массивы имеют однородный тип: все элементы одного массива должны быть одного типа. Такие массивы также могут быть представлениями буферов памяти, выделенных расширениями C/C++, Python и Fortran для интерпретатора CPython, без необходимости копирования данных, что обеспечивает определенную степень совместимости с существующими численными библиотеками. Эта функциональность используется пакетом SciPy, который оборачивает ряд таких библиотек (в частности, BLAS и LAPACK). NumPy имеет встроенную поддержку массивов, отображаемых в память, и Numba. Cython и Pythran являются альтернативами статической компиляции. Многие современные крупномасштабные приложения для научных вычислений имеют требования, превышающие возможности массивов NumPy. Например, массивы NumPy обычно загружаются в память компьютера, которой может быть недостаточно для анализа больших наборов данных. Кроме того, операции NumPy выполняются на одном центральном процессоре. Однако многие операции линейной алгебры могут быть ускорены путем выполнения на кластерах центральных процессоров или специализированном оборудовании, таком как графические процессоры (GPU) и TPU, которые используются многими приложениями глубокого обучения. В результате в научной экосистеме Python за последние годы появилось несколько альтернативных реализаций массивов, таких как Dask для распределенных массивов и TensorFlow или JAX для вычислений на GPU. Благодаря своей популярности, они часто реализуют подмножество API NumPy или имитируют его, чтобы пользователи могли изменить реализацию массива с минимальными изменениями в коде. Реализация, ускоренная фреймворком CUDA от Nvidia, также показала потенциал для более быстрых вычислений, являясь заменой NumPy.