![]() | |
Автор (ы) оригинала | Трэвис Олифант |
---|---|
Разработчики) | Общественный проект |
Начальная версия | As Numeric, 1995 ; как NumPy, 2006 |
Стабильный выпуск | 1.20.1 / 7 февраля 2021 г . [1] |
Репозиторий | ![]() |
Написано в | Python , C |
Операционная система | Кроссплатформенность |
Тип | Числовой анализ |
Лицензия | BSD [2] |
Веб-сайт | numpy ![]() |
NumPy (произносится / п ʌ м р aɪ / ( NUM -Ру ) , а иногда и / п ʌ т р я / [3] [4] ( NUM -pee )) представляет собой библиотеку для языка программирования Python , добавив поддержку большие многомерные массивы и матрицы , а также большой набор высокоуровневых математических функций для работы с этими массивами. [5]Предок NumPy, Numeric, был первоначально создан Джимом Хугуниным при участии нескольких других разработчиков. В 2005 году Трэвис Олифант создал NumPy, включив функции конкурирующего Numarray в Numeric с обширными модификациями. NumPy - это программное обеспечение с открытым исходным кодом, и у него много участников.
История [ править ]
Язык программирования Python изначально не был разработан для числовых вычислений, но с самого начала привлек внимание научного и инженерного сообщества. В 1995 году была основана группа специальных интересов (SIG) matrix-sig с целью определения пакета для вычислений с массивами ; среди его членов был разработчик и разработчик Python Гвидо ван Россум , который расширил синтаксис Python (в частности, синтаксис индексации), чтобы упростить вычисление массивов . [6]
Реализация пакета матрицы была завершена Джимом Фултон, затем обобщенно [ далее объяснение необходимости ] с помощью Джима Хагунина и называется Numeric [6] (также по- разному известно как «расширения Численного Python» или «NumPy»). [7] [8] Хугунин, аспирант Массачусетского технологического института (MIT), [8] : 10 присоединились к Корпорации национальных исследовательских инициатив (CNRI) в 1997 году, чтобы работать над JPython , [6] оставив Пола Дюбуа из Ливерморская национальная лаборатория имени Лоуренса (LLNL) возьмет на себя функции сопровождающего.[8] : 10 Среди других ранних участников - Дэвид Ашер, Конрад Хинсен и Трэвис Олифант . [8] : 10
Новый пакет под названием Numarray был написан как более гибкая замена Numeric. [9] Как и Numeric, он также устарел. [10] [11] Numarray выполнял более быстрые операции для больших массивов, но был медленнее, чем Numeric для маленьких, [12] поэтому какое-то время оба пакета использовались параллельно для разных случаев использования. Последняя версия Numeric (v24.2) была выпущена 11 ноября 2005 г., а последняя версия numarray (v1.5.2) - 24 августа 2006 г. [13]
Было желание включить Numeric в стандартную библиотеку Python, но Гвидо ван Россум решил, что тогда код нельзя было поддерживать в его состоянии. [ когда? ] [14]
В начале 2005 года разработчик NumPy Трэвис Олифант хотел объединить сообщество вокруг единого пакета массивов и перенес функции Numarray в Numeric, выпустив результат как NumPy 1.0 в 2006 году. [9] Этот новый проект был частью SciPy . Чтобы избежать установки большого пакета SciPy только для получения объекта массива, этот новый пакет был отделен и назван NumPy. Поддержка Python 3 была добавлена в 2011 году с версией NumPy 1.5.0. [15]
В 2011 году PyPy начал разработку реализации API NumPy для PyPy. [16] Он еще не полностью совместим с NumPy. [17]
Особенности [ править ]
NumPy нацелен на эталонную реализацию Python CPython , которая не является оптимизирующим интерпретатором байт - кода . Математические алгоритмы, написанные для этой версии Python, часто работают намного медленнее, чем скомпилированные эквиваленты. NumPy частично решает проблему медлительности, предоставляя многомерные массивы и функции и операторы, которые эффективно работают с массивами, требуя переписывания некоторого кода, в основном внутренних циклов , с использованием NumPy.
Использование NumPy в Python дает функциональность, сравнимую с MATLAB, поскольку они оба интерпретируются, [18] и оба позволяют пользователю писать быстрые программы, пока большинство операций работают с массивами или матрицами вместо скаляров . Для сравнения, MATLAB может похвастаться большим количеством дополнительных наборов инструментов, особенно Simulink , тогда как NumPy внутренне интегрирован с Python, более современным и полным языком программирования. Кроме того, доступны дополнительные пакеты Python; SciPy - это библиотека, которая добавляет больше функций, подобных MATLAB, а Matplotlib - это пакет для построения графиков, который предоставляет функциональные возможности построения графиков, подобные MATLAB. Внутри и MATLAB, и NumPy полагаются на BLAS.и LAPACK для эффективных вычислений линейной алгебры.
Привязки Python широко используемой библиотеки компьютерного зрения OpenCV используют массивы NumPy для хранения данных и работы с ними. Поскольку изображения с несколькими каналами просто представлены в виде трехмерных массивов, индексирование, нарезка или маскирование с помощью других массивов являются очень эффективными способами доступа к определенным пикселям изображения. Массив NumPy как универсальная структура данных в OpenCV для изображений, извлеченных точек характеристик , ядер фильтров и многого другого значительно упрощает рабочий процесс программирования и отладки .
Структура данных ndarray [ править ]
Основная функциональность NumPy - это его "ndarray" для n- мерного массива, структура данных. Эти массивы представляют собой полосатые представления о памяти. [9] В отличие от встроенной в Python структуры данных списка, эти массивы однородно типизированы: все элементы одного массива должны быть одного типа.
Такие массивы также можно просматривать в буферах памяти, выделенных расширениями C / C ++ , Cython и Fortran для интерпретатора CPython, без необходимости копировать данные, что обеспечивает определенную степень совместимости с существующими числовыми библиотеками. Эта функциональность используется пакетом SciPy , который включает в себя ряд таких библиотек (особенно BLAS и LAPACK ). NumPy имеет встроенную поддержку ndarrays с отображением памяти. [9]
Ограничения [ править ]
Вставка или добавление записей в массив не так тривиально, как со списками Python. Np.pad (...) процедура для расширения массивов фактически создает новые массивы желаемой формы и значения отступов, копии данного массива в новую и возвращает его. Операция NumPy np.concatenate ([a1, a2]) на самом деле не связывает два массива, а возвращает новый, последовательно заполненный записями из обоих заданных массивов. Изменение размерности массива с помощью np.reshape (...) возможно только до тех пор, пока количество элементов в массиве не изменяется. Эти обстоятельства проистекают из того факта, что массивы NumPy должны быть представлениями в непрерывных буферах памяти. Пакет замены под названием Blaze пытается обойти это ограничение.[19]
Алгоритмы, которые нельзя выразить как векторизованные операции, обычно будут выполняться медленно, потому что они должны быть реализованы на «чистом Python», в то время как векторизация может увеличить сложность памяти некоторых операций с постоянной до линейной, поскольку необходимо создавать временные массивы размером с входы. Компиляция числового кода во время выполнения была реализована несколькими группами, чтобы избежать этих проблем; решения с открытым исходным кодом, которые взаимодействуют с NumPy, включают scipy.weave
numexpr [20] и Numba . [21] Cython и Pythran представляют собой статические компилирующие альтернативы им.
Требования многих современных крупномасштабных научных вычислительных приложений превышают возможности массивов NumPy. Например, массивы NumPy обычно загружаются в память компьютера , которой может быть недостаточно для анализа больших наборов данных. Кроме того, операции NumPy выполняются на одном процессоре . Однако многие операции линейной алгебры можно ускорить, выполняя их на кластерах процессоров или специализированного оборудования, такого как графические процессоры и TPU , на которые полагаются многие приложения глубокого обучения . В результате за последние годы в научной экосистеме Python появилось несколько альтернативных реализаций массивов, напримерDask для распределенных массивов и TensorFlow или JAX для вычислений на графических процессорах. Из-за своей популярности они часто реализуют подмножество API Numpy или имитируют его, так что пользователи могут изменять свою реализацию массива с минимальными необходимыми изменениями в своем коде. [5]
Примеры [ править ]
- Создание массива
>>> импортировать numpy как np >>> x = np . массив ([ 1 , 2 , 3 ]) >>> x массив ([1, 2, 3]) >>> y = np . arange ( 10 ) # как список Python (range (10)), но возвращает массив >>> y array ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
- Основные операции
>>> а = нп . массив ([ 1 , 2 , 3 , 6 ]) >>> b = np . linspace ( 0 , 2 , 4 ) # создаем массив из четырех равноотстоящих точек, начиная с 0 и заканчивая 2. >>> c = a - b >>> c array ([1., 1.33333333, 1.66666667, 4.] ) >>> a ** 2 массив ([1, 4, 9, 36])
- Универсальные функции
>>> а = нп . linspace ( - np . pi , np . pi , 100 ) >>> b = np . грех ( а ) >>> с = нп . cos ( а )
- Линейная алгебра
>>> от numpy.random импорта рэнд >>> из numpy.linalg импорта решить , и >>> = нп . 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 ) массив ([[- 2.27683616, 0.96045198, 0.07909605], [1.04519774, -0.56497175, 0.1299435], [0.39548023, 0.05649718, -0.11299435]]) >>> b = np . array ([ 3 , 2 , 1 ]) >>> resolve ( a , b ) # решаем уравнение ax = b array ([- 4.83050847, 2.13559322, 1.18644068]) >>> c = rand ( 3 , 3 ) * 20 # создаем случайную матрицу 3x3 значений в пределах [0,1] с масштабированием на 20>>> c массив ([[3.98732789, 2.47702609, 4.71167924], [9.24410671, 5.5240412, 10.6468792], [10.38136661, 8.44968437, 15.17639591]]) >>> np . dot ( a , c ) # матричный массив умножения ([[53.61964114, 38.8741616, 71.53462537], [118.4935668, 86.14012835, 158.40440712], [155.04043289, 104.3499231, 195.26228855]]) >>> a @ c # Начиная с Python 3.5 и Num 1.10 массив ([[53.61964114, 38.8741616, 71.53462537], [118.4935668, 86.14012835, 158.40440712], [155.04043289, 104.3499231, 195.26228855]])
- Тензоры
>>> M = np . нули ( shape = ( 2 , 3 , 5 , 7 , 11 )) >>> T = np . транспонирование ( М , ( 4 , 2 , 1 , 3 , 0 )) >>> Т . форма (11, 5, 3, 7, 2)
- Включение в OpenCV
>>> импортировать numpy как np >>> импортировать cv2 >>> r = np . reshape ( np . arange ( 256 * 256 ) % 256 , ( 256 , 256 )) # массив пикселей 256x256 с горизонтальным градиентом от 0 до 255 для канала красного цвета >>> g = np . zeros_like ( r ) # массив того же размера и типа, что и r, но заполненный нулями для канала зеленого цвета >>> b = r . T # транспонированный r даст вертикальный градиент для синего цветового канала >>> cv2 . imwrite ( 'gradient.png' , np . dstack ([ b , g , r ])) # Изображения OpenCV интерпретируются как BGR, массив с глубиной стека будет записан в 8-битный RGB-файл PNG с именем 'gradient.png' Правда
- Поиск ближайшего соседа - Итерационный алгоритм Python и векторизованная версия NumPy
>>> # # # Чистый итеративный 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 >>> для idx , точка в перечислении ( точки ) : # перебрать все точки ... dist = sum ([( dp - dq ) ** 2 для dp ,dq in zip ( point , qPoint )]) ** 0.5 # вычислить евклидово расстояние для каждой точки до q ... if dist < minDist или minDist < 0 : # при необходимости обновить минимальное расстояние и индекс соответствующей точки .. . minDist = dist ... minIdx = idx>>> print ( 'Ближайшая точка к q: {0} ' . format ( points [ minIdx ])) Ближайшая точка к q: [3, 4, 4]>>> # # # Эквивалентная векторизация NumPy # # # >>> 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 . массив ([ 4 , 5 , 3 ]) >>> minIdx = np . argmin ( np . linalg . norm ( points - qPoint , axis = 1 )) # вычислить все евклидовы расстояния сразу и вернуть индекс наименьшего из них >>> print ( 'Ближайшая точка к q: {0} ' . format ( points [ minIdx ])) Ближайшая точка к q: [3 4 4]
См. Также [ править ]
- Программирование массива
- Список программ численного анализа
Ссылки [ править ]
- ^ "Выпуски - numpy / numpy" . Проверено 8 февраля 2021 года - через GitHub .
- ^ "NumPy - NumPy" . numpy.org . Разработчики NumPy.
- ^ Сосна, Дэвид (2014). «Ресурсы Python» . Университет Рутгерса . Проверено 7 апреля 2017 .
- ^ "Как вы говорите" тупой "?" . Reddit. 2015 . Проверено 7 апреля 2017 .
- ^ a b Чарльз Р. Харрис; К. Джаррод Миллман; Стефан Й. ван дер Вальт; и другие. (16 сентября 2020 г.). «Программирование массивов с помощью NumPy» (PDF) . Природа . 585 (7825): 357–362. DOI : 10.1038 / S41586-020-2649-2 . ISSN 1476-4687 . PMC 7759461 . PMID 32939066 . Викиданные Q99413970 .
- ^ a b c Миллман, К. Джаррод; Айвазис, Майкл (2011). «Python для ученых и инженеров» . Вычислительная техника в науке и технике . 13 (2): 9–12. Bibcode : 2011CSE .... 13b ... 9M . DOI : 10,1109 / MCSE.2011.36 . Архивировано из оригинала на 2019-02-19 . Проверено 7 июля 2014 .
- ^ Трэвис Олифант (2007). «Python для научных вычислений» (PDF) . Вычислительная техника в науке и технике . Архивировано из оригинального (PDF) 14 октября 2013 года . Проверено 12 октября 2013 .
- ^ а б в г Дэвид Ашер; Поль Ф. Дюбуа; Конрад Хинсен; Джим Хугунин; Трэвис Олифант (1999). «Числовой Python» (PDF) .
- ^ а б в г ван дер Вальт, Стефан; Кольбер, С. Крис; Вароко, Гаэль (2011). «Массив NumPy: структура для эффективных численных вычислений». Вычислительная техника в науке и технике . IEEE. 13 (2): 22. arXiv : 1102.1523 . Bibcode : 2011CSE .... 13b..22V . DOI : 10,1109 / MCSE.2011.37 . S2CID 16907816 .
- ^ "Домашняя страница Numarray" . Проверено 24 июня 2006 .
- ↑ Трэвис Э. Олифант (7 декабря 2006 г.). Руководство по NumPy . Дата обращения 2 февраля 2017 .
- ^ Трэвис Олифант и другие разработчики SciPy. «[Numpy-обсуждение] Статус числового» . Дата обращения 2 февраля 2017 .
- ^ "Файлы NumPy Sourceforge" . Проверено 24 марта 2008 .
- ^ "History_of_SciPy - дамп вики SciPy" . scipy.github.io .
- ^ «Примечания к выпуску NumPy 1.5.0» . Проверено 29 апреля 2011 .
- ^ «Блог статуса PyPy: финансирование и обновление статуса NumPy» . Проверено 22 декабря 2011 .
- ^ "Статус NumPyPy" . Проверено 14 октября 2013 .
- ^ Сообщество SciPy. «NumPy для пользователей Matlab» . Дата обращения 2 февраля 2017 .
- ^ "Blaze Ecosystem Docs" . Прочтите Документы . Проверено 17 июля 2016 года .
- ^ Франсеск Альтед. "numexpr" . Проверено 8 марта 2014 .
- ^ "Нумба" . Проверено 8 марта 2014 .
Дальнейшее чтение [ править ]
- Брессерт, Эли (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.
Внешние ссылки [ править ]
- Официальный сайт
- История NumPy