NumPy

NumPy (Numeric Python, Числовой Python) — это библиотека для работы с многомерными массивами, также включает набор математических функций, которые применяются над ними. За счет собственной оптимизации кода на языке C и Fortran обеспечиваются быстрые вычисления по сравнению с обычными структурами данных в Python.

Особенности

  • Поддержка N-мерных массивов с быстрой векторизацией и индексацией. На данный момент массивы NumPy стали стандартом де-факто для вычислений на Python [1].
  • Инструменты численных вычислений. В библиотеке есть множество математических функций, генераторы случайных чисел, операции линейной алгебры, преобразования Фурье и многое другое.
  • Совместимость. Поддержка широкого спектра вычислительных платформ, а также хорошо работает с распределенными библиотеками, библиотеками с графическим процессором (GPU) и разреженными массивами (sparse arrays).
  • Простота использования. Несмотря на большую и подробную документацию, для практического использования требуется знать всего несколько концептов массивов NumPy.
  • Библиотека имеет открытый исходный код под лицензией BSD, которая разрабатывается и поддерживается на GitHub [2].

Сферы применения

NumPy нашел большое количество применений в разных сферах деятельности. Перечислим некоторые из них:

  • Научные исследования. Почти каждый ученый, работающий с Python, использует возможности библиотеки, поскольку она привносит вычислительную мощность таких языков, как C и Fortran, в Python – язык, который намного проще изучать и использовать.
  • Стандарт для других библиотека и фрейморков. Многие разработчики при создании собственных библиотек ориентируются на интерфейс NumPy, поэтому в TensorFlow, PyTorch, MXNet и др. можно конвертировать массивы NumPy в тензоры библиотеки и наоборот.
  • Data Science. NumPy лежит в основе богатой экосистемы библиотек для анализа данных, поскольку обеспечивает быстрыми вычислениями.
Список Python-библиотек для Data Science
Библиотеки Python для Data Science
  • Machine learning. NumPy составляет основу мощных библиотек машинного обучения, таких как scikit-learn и SciPy. По мере роста машинного обучения растет и список библиотек, построенных на NumPy.
  • Визуализация данных. NumPy – важный компонент в растущем ландшафте визуализации данных, который включает в себя Matplotlib, Seaborn, Plotly, Altair, Bokeh, Holoviz, Vispy и Napari, и это лишь некоторые из них.
  • Big Data. За счет высокой оптимизированности библиотеки вычисления на больших данных обеспечиваются за считанные секунды.

Почему NumPy такой быстрый

Быстрота библиотеки обеспечивает за счет векторизации, которая описывает отсутствие каких-либо явных циклов, индексации и т. д. В коде эти вещи происходят «за кулисами» в оптимизированном, предварительно скомпилированном коде C. Векторизованный код имеет множество преимуществ, среди которых:

  • лаконичность и легкость чтения;
  • меньше строк кода – меньше ошибок;
  • код больше похож на стандартную математическую нотацию, что, как правило, упрощает правильное кодирование математических конструкций;
  • векторизация соответствует стилю кодирования на Python без неэффективных и трудных для чтения циклов for.

В основе векторизации лежит класс ndarray – многомерный контейнер элементов одного типа данных и размера (int32, float32 и т.д.). Объекты этого класса занимают меньше памяти, а операции над ними производятся быстрее, чем с обычными списками Python.

Создание массивов

Массивы ndarray могут быть созданы несколькими способами. Например, может создать массив явно:

>>> import numpy as np
>>> np.array([1, 2, 3, 4])
array([1, 2, 3, 4])
>>> np.array([1, 2, 3, 4], dtype=np.int32)
array([1, 2, 3, 4], dtype=int32)

Однако более удобный способ — это определить размер массива и заполнить его либо случайными значениям, либо значениями по порядку.

# случайные значения int
>>> np.random.randint(low=5, size=(2,2))
array([[4, 2],
       [2, 1]])
# случайные значения float (от 0 до 1)
>>> np.random.rand(2,2)
array([[0.25074988, 0.9872445 ],
       [0.95191957, 0.31197943]])
# по порядку
>>> np.arange(1, 5)
array([1, 2, 3, 4])

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

>>> np.zeros(shape=(3,3))
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])
>>> np.ones(shape=(3,3))
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

Читайте также:

Источники

  1. Официальная страница
  2. Репозиторий на Github