Открыть сервисСервис

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(): единичные матрицы.

Математические операции

Манипуляции с формой и размерностью

  • 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 достигается за счёт нескольких факторов:

  1. Реализация на C и Fortran: Критические внутренние циклы написаны на компилируемых языках, что обеспечивает скорость, сравнимую с C или Fortran.
  2. Векторизация: Операции над массивами выполняются с помощью оптимизированных библиотек линейной алгебры, таких как BLAS и LAPACK (например, OpenBLAS, Intel MKL).
  3. Управление памятью: Массивы хранятся в непрерывных блоках памяти, что улучшает кэширование и скорость доступа.

Критика и ограничения

Несмотря на свою мощь, 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.

Источники

  1. Oliphant, T. E. (2006). A guide to NumPy. Trelgol Publishing.
  2. Документация NumPy. NumPy Reference Guide.
  3. Harris, C. R., Millman, K. J., van der Walt, S. J., et al. (2020). Array programming with NumPy. Nature, 585(7825), 357–362.
  4. Ван дер Вальт, С., Кольберт, С., & Варокво, Г. (2011). The NumPy array: a structure for efficient numerical computation. Computing in Science & Engineering, 13(2), 22–30.
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru