Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

NumPy (произносится / п ʌ м р / ( 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.weavenumexpr [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]

См. Также [ править ]

  • Программирование массива
  • Список программ численного анализа

Ссылки [ править ]

  1. ^ "Выпуски - numpy / numpy" . Проверено 8 февраля 2021 года - через GitHub .
  2. ^ "NumPy - NumPy" . numpy.org . Разработчики NumPy.
  3. ^ Сосна, Дэвид (2014). «Ресурсы Python» . Университет Рутгерса . Проверено 7 апреля 2017 .
  4. ^ "Как вы говорите" тупой "?" . Reddit. 2015 . Проверено 7 апреля 2017 .
  5. ^ 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 .     
  6. ^ a b c Миллман, К. Джаррод; Айвазис, Майкл (2011). «Python для ученых и инженеров» . Вычислительная техника в науке и технике . 13 (2): 9–12. Bibcode : 2011CSE .... 13b ... 9M . DOI : 10,1109 / MCSE.2011.36 . Архивировано из оригинала на 2019-02-19 . Проверено 7 июля 2014 .
  7. ^ Трэвис Олифант (2007). «Python для научных вычислений» (PDF) . Вычислительная техника в науке и технике . Архивировано из оригинального (PDF) 14 октября 2013 года . Проверено 12 октября 2013 .
  8. ^ а б в г Дэвид Ашер; Поль Ф. Дюбуа; Конрад Хинсен; Джим Хугунин; Трэвис Олифант (1999). «Числовой Python» (PDF) .
  9. ^ а б в г ван дер Вальт, Стефан; Кольбер, С. Крис; Вароко, Гаэль (2011). «Массив NumPy: структура для эффективных численных вычислений». Вычислительная техника в науке и технике . IEEE. 13 (2): 22. arXiv : 1102.1523 . Bibcode : 2011CSE .... 13b..22V . DOI : 10,1109 / MCSE.2011.37 . S2CID 16907816 . 
  10. ^ "Домашняя страница Numarray" . Проверено 24 июня 2006 .
  11. Трэвис Э. Олифант (7 декабря 2006 г.). Руководство по NumPy . Дата обращения 2 февраля 2017 .
  12. ^ Трэвис Олифант и другие разработчики SciPy. «[Numpy-обсуждение] Статус числового» . Дата обращения 2 февраля 2017 .
  13. ^ "Файлы NumPy Sourceforge" . Проверено 24 марта 2008 .
  14. ^ "History_of_SciPy - дамп вики SciPy" . scipy.github.io .
  15. ^ «Примечания к выпуску NumPy 1.5.0» . Проверено 29 апреля 2011 .
  16. ^ «Блог статуса PyPy: финансирование и обновление статуса NumPy» . Проверено 22 декабря 2011 .
  17. ^ "Статус NumPyPy" . Проверено 14 октября 2013 .
  18. ^ Сообщество SciPy. «NumPy для пользователей Matlab» . Дата обращения 2 февраля 2017 .
  19. ^ "Blaze Ecosystem Docs" . Прочтите Документы . Проверено 17 июля 2016 года .
  20. ^ Франсеск Альтед. "numexpr" . Проверено 8 марта 2014 .
  21. ^ "Нумба" . Проверено 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