NumPy - NumPy

NumPy
Логотип NumPy 2020.svg
Автор (ы) оригинала Трэвис Олифант
Разработчики) Общественный проект
Первый выпуск As Numeric, 1995 ; как NumPy, 2006 ( 1995 ) ( 2006 )
Стабильный выпуск
1.21.1 / 18 июля 2021 г . ; 36 дней назад ( 2021-07-18 )
Репозиторий Отредактируйте это в Викиданных
Написано в Python , C
Операционная система Кроссплатформенность
Тип Числовой анализ
Лицензия BSD
Веб-сайт numpy .org Отредактируйте это в Викиданных

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

История

Язык программирования Python изначально не был разработан для числовых вычислений, но с самого начала привлек внимание научного и инженерного сообщества. В 1995 году была основана группа специальных интересов (SIG) matrix-sig с целью определения пакета для вычислений с массивами ; среди его членов был разработчик и разработчик Python Гвидо ван Россум , который расширил синтаксис Python (в частности, синтаксис индексации), чтобы упростить вычисление массивов .

Реализация матричного пакета была завершена Джимом Фултоном, затем обобщена Джимом Хьюгуниным и названа Numeric (также известная как «Числовые расширения Python» или «NumPy»). Хугунин, аспирант Массачусетского технологического института (MIT), присоединился к Корпорации национальных исследовательских инициатив (CNRI) в 1997 году для работы над JPython , оставив Пола Дюбуа из Ливерморской национальной лаборатории Лоуренса (LLNL), чтобы он стал сопровождающим. Среди других ранних участников - Дэвид Ашер, Конрад Хинсен и Трэвис Олифант .

Новый пакет под названием Numarray был написан как более гибкая замена Numeric. Как и Numeric, он тоже устарел. Numarray выполнял более быстрые операции для больших массивов, но был медленнее, чем Numeric для маленьких, поэтому какое-то время оба пакета использовались параллельно для разных случаев использования. Последняя версия Numeric (v24.2) была выпущена 11 ноября 2005 года, а последняя версия numarray (v1.5.2) была выпущена 24 августа 2006 года.

Было желание включить Numeric в стандартную библиотеку Python, но Гвидо ван Россум решил, что тогда код нельзя было поддерживать в его состоянии.

В начале 2005 года разработчик NumPy Трэвис Олифант хотел объединить сообщество вокруг единого пакета массивов и перенес функции Numarray в Numeric, выпустив результат как NumPy 1.0 в 2006 году. Этот новый проект был частью SciPy . Чтобы избежать установки большого пакета SciPy только для получения объекта массива, этот новый пакет был отделен и назван NumPy. Поддержка Python 3 была добавлена ​​в 2011 году с NumPy версии 1.5.0.

В 2011 году PyPy начал разработку реализации API NumPy для PyPy. Он еще не полностью совместим с NumPy.

Функции

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

Использование NumPy в Python дает функциональность, сравнимую с MATLAB, поскольку они оба интерпретируются, и оба позволяют пользователю писать быстрые программы, пока большинство операций работают с массивами или матрицами вместо скаляров . Для сравнения, MATLAB может похвастаться большим количеством дополнительных наборов инструментов, особенно Simulink , тогда как NumPy внутренне интегрирован с Python, более современным и полным языком программирования . Кроме того, доступны дополнительные пакеты Python; SciPy - это библиотека, которая добавляет больше функций, подобных MATLAB, а Matplotlib - это пакет для построения графиков , который предоставляет функциональные возможности построения графиков, подобные MATLAB. Внутри и MATLAB, и NumPy полагаются на BLAS и LAPACK для эффективных вычислений линейной алгебры .

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

Структура данных ndarray

Основная функциональность NumPy - это его "ndarray" для n- мерного массива, структура данных. Эти массивы представляют собой полосатые представления о памяти. В отличие от встроенной в Python структуры данных списка, эти массивы однородно типизированы: все элементы одного массива должны быть одного типа.

Такие массивы также можно просматривать в буферах памяти, выделенных расширениями C / C ++ , Cython и Fortran для интерпретатора CPython, без необходимости копировать данные, что обеспечивает определенную совместимость с существующими числовыми библиотеками. Эта функциональность используется пакетом SciPy, который включает в себя ряд таких библиотек (особенно BLAS и LAPACK). NumPy имеет встроенную поддержку ndarrays с отображением памяти.

Ограничения

Вставка или добавление записей в массив не так тривиально, как со списками Python. Процедура np.pad(...)расширения массивов фактически создает новые массивы желаемой формы и значений заполнения, копирует данный массив в новый и возвращает его. np.concatenate([a1,a2])Операция NumPy на самом деле не связывает два массива, а возвращает новый, последовательно заполненный записями из обоих заданных массивов. Изменение размерности массива с помощью np.reshape(...)возможно только до тех пор, пока количество элементов в массиве не изменяется. Эти обстоятельства проистекают из того факта, что массивы NumPy должны быть представлениями в непрерывных буферах памяти . Пакет замены под названием Blaze пытается обойти это ограничение.

Алгоритмы , которые не могут быть выражены как векторизованная операция, обычно будут выполняться медленно, потому что они должны быть реализованы на «чистом Python», в то время как векторизация может увеличить сложность памяти некоторых операций с постоянной до линейной, поскольку необходимо создавать временные массивы размером с входы. Компиляция числового кода во время выполнения была реализована несколькими группами, чтобы избежать этих проблем; решения с открытым исходным кодом, которые взаимодействуют с NumPy, включают scipy.weave, numexpr и Numba . Cython и Pythran - альтернативы им при статической компиляции.

Требования многих современных крупномасштабных научных вычислительных приложений превышают возможности массивов NumPy. Например, массивы NumPy обычно загружаются в память компьютера , которой может быть недостаточно для анализа больших наборов данных . Кроме того, операции NumPy выполняются на одном процессоре . Однако многие операции линейной алгебры можно ускорить, выполняя их на кластерах процессоров или специализированного оборудования, такого как графические процессоры и TPU , на которые полагаются многие приложения глубокого обучения . В результате в последние годы в научной экосистеме Python появилось несколько альтернативных реализаций массивов, таких как Dask для распределенных массивов и TensorFlow или JAX для вычислений на графических процессорах. Из-за своей популярности они часто реализуют подмножество API Numpy или имитируют его, так что пользователи могут изменять свою реализацию массива с минимальными необходимыми изменениями в своем коде. Недавно введена библиотека им нять свои , ускоряются Nvidia «s CUDA структуры, также показал потенциал для более быстрого вычисления, будучи» заменой "в NumPy.

Примеры

Создание массива
>>> import numpy as np
>>> x = np.array([1, 2, 3])
>>> x
array([1, 2, 3])
>>> y = np.arange(10)  # like Python's list(range(10)), but returns an array
>>> y
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Основные операции
>>> a = np.array([1, 2, 3, 6])
>>> b = np.linspace(0, 2, 4)  # create an array with four equally spaced points starting with 0 and ending with 2.
>>> c = a - b
>>> c
array([ 1.        ,  1.33333333,  1.66666667,  4.        ])
>>> a**2
array([ 1,  4,  9, 36])
Универсальные функции
>>> a = np.linspace(-np.pi, np.pi, 100) 
>>> b = np.sin(a)
>>> c = np.cos(a)
Линейная алгебра
>>> from numpy.random import rand
>>> from numpy.linalg import solve, inv
>>> a = np.array([[1, 2, 3], [3, 4, 6.7], [5, 9.0, 5]])
>>> a.transpose()
array([[ 1. ,  3. ,  5. ],
       [ 2. ,  4. ,  9. ],
       [ 3. ,  6.7,  5. ]])
>>> inv(a)
array([[-2.27683616,  0.96045198,  0.07909605],
       [ 1.04519774, -0.56497175,  0.1299435 ],
       [ 0.39548023,  0.05649718, -0.11299435]])
>>> b =  np.array([3, 2, 1])
>>> solve(a, b)  # solve the equation ax = b
array([-4.83050847,  2.13559322,  1.18644068])
>>> c = rand(3, 3) * 20  # create a 3x3 random matrix of values within [0,1] scaled by 20
>>> c
array([[  3.98732789,   2.47702609,   4.71167924],
       [  9.24410671,   5.5240412 ,  10.6468792 ],
       [ 10.38136661,   8.44968437,  15.17639591]])
>>> np.dot(a, c)  # matrix multiplication
array([[  53.61964114,   38.8741616 ,   71.53462537],
       [ 118.4935668 ,   86.14012835,  158.40440712],
       [ 155.04043289,  104.3499231 ,  195.26228855]])
>>> a @ c # Starting with Python 3.5 and NumPy 1.10
array([[  53.61964114,   38.8741616 ,   71.53462537],
       [ 118.4935668 ,   86.14012835,  158.40440712],
       [ 155.04043289,  104.3499231 ,  195.26228855]])
Тензоры
>>> M = np.zeros(shape=(2, 3, 5, 7, 11))
>>> T = np.transpose(M, (4, 2, 1, 3, 0))
>>> T.shape
(11, 5, 3, 7, 2)
Включение в OpenCV
>>> import numpy as np
>>> import cv2
>>> r = np.reshape(np.arange(256*256)%256,(256,256))  # 256x256 pixel array with a horizontal gradient from 0 to 255 for the red color channel
>>> g = np.zeros_like(r)  # array of same size and type as r but filled with 0s for the green color channel
>>> b = r.T # transposed r will give a vertical gradient for the blue color channel
>>> cv2.imwrite('gradients.png', np.dstack([b,g,r]))  # OpenCV images are interpreted as BGR, the depth-stacked array will be written to an 8bit RGB PNG-file called 'gradients.png'
True
Поиск ближайшего соседа - Итерационный алгоритм Python и векторизованная версия NumPy
>>> # # # Pure iterative Python # # #
>>> points = [[9,2,8],[4,7,2],[3,4,4],[5,6,9],[5,0,7],[8,2,7],[0,3,2],[7,3,0],[6,1,1],[2,9,6]]
>>> qPoint = [4,5,3]
>>> minIdx = -1
>>> minDist = -1
>>> for idx, point in enumerate(points):  # iterate over all points
...     dist = sum([(dp-dq)**2 for dp,dq in zip(point,qPoint)])**0.5  # compute the euclidean distance for each point to q
...     if dist < minDist or minDist < 0:  # if necessary, update minimum distance and index of the corresponding point
...         minDist = dist
...         minIdx = idx

>>> print('Nearest point to q: {0}'.format(points[minIdx]))
Nearest point to q: [3, 4, 4]

>>> # # # Equivalent NumPy vectorization # # #
>>> import numpy as np
>>> points = np.array([[9,2,8],[4,7,2],[3,4,4],[5,6,9],[5,0,7],[8,2,7],[0,3,2],[7,3,0],[6,1,1],[2,9,6]])
>>> qPoint = np.array([4,5,3])
>>> minIdx = np.argmin(np.linalg.norm(points-qPoint,axis=1))  # compute all euclidean distances at once and return the index of the smallest one
>>> print('Nearest point to q: {0}'.format(points[minIdx]))
Nearest point to q: [3 4 4]

Смотрите также

использованная литература

дальнейшее чтение

  • Брессерт, Эли (2012). Scipy и Numpy: обзор для разработчиков . О'Рейли. ISBN 978-1-4493-0546-8.
  • МакКинни, Уэс (2017). Python для анализа данных: обработка данных с помощью Pandas, NumPy и IPython (2-е изд.). Севастополь: О'Рейли. ISBN 978-1-4919-5766-0.
  • Вандерплас, Джейк (2016). «Введение в NumPy». Справочник Python по науке о данных: основные инструменты для работы с данными . О'Рейли. С. 33–96. ISBN 978-1-4919-1205-8.

внешние ссылки