NumPy
Оригинальный автор(ы) | Трэвис Олифант |
---|---|
Разработчик(и) | Общественный проект |
Первоначальный выпуск | Как Numeric, 1995 | ; как NumPy, 2006
Стабильная версия | 2.0.1 [1]
/ 21 июля 2024 г |
Репозиторий | |
Написано в | Питон , С |
Операционная система | Кросс-платформенный |
Тип | Численный анализ |
Лицензия | БСД [2] |
Веб-сайт | бестолковый |
NumPy (произносится / ˈ n ʌ m p aɪ / NUM -py ) — это библиотека для языка программирования Python , добавляющая поддержку больших многомерных массивов и матриц , а также большую коллекцию высокого уровня математических функций для работы с ними. эти массивы. [3] Предшественник NumPy, Numeric, был первоначально создан Джимом Хугунином при участии нескольких других разработчиков. В 2005 году Трэвис Олифант создал NumPy, включив в Numeric функции конкурирующего Numarray с обширными модификациями. NumPy — это программное обеспечение с открытым исходным кодом , в котором участвует множество разработчиков. NumPy — это проект, финансируемый NumFOCUS. [4]
История
[ редактировать ]матрица-подпись
[ редактировать ]Язык программирования Python изначально не был разработан для численных вычислений, но сразу привлек внимание научного и инженерного сообщества. В 1995 году была основана группа специальных интересов (SIG) Matrix-sig с целью определения пакета вычислений на массивах ; среди его членов был дизайнер и сопровождающий Python Гвидо ван Россум , который расширил синтаксис Python (в частности, синтаксис индексирования). [5] ), чтобы упростить вычисления с массивами . [6]
Числовой
[ редактировать ]Реализация матричного пакета была завершена Джимом Фултоном, а затем обобщена. [ нужны дальнейшие объяснения ] Джимом Хугунином и называется Numeric [6] (также известные как «Числовые расширения Python» или «NumPy»), с влиянием семейства APL языков , Basis, MATLAB , FORTRAN , S и S+ и других. [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]
NumPy
[ редактировать ]В начале 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] По состоянию на 2023 год он еще не полностью совместим с NumPy. [17]
Функции
[ редактировать ]NumPy нацелен на Python CPython эталонную реализацию , которая представляет собой неоптимизирующий байт-кода интерпретатор . Математические алгоритмы, написанные для этой версии Python, часто работают намного медленнее, чем скомпилированные эквиваленты, из-за отсутствия оптимизации компилятора. NumPy частично решает проблему медленности, предоставляя многомерные массивы, функции и операторы, которые эффективно работают с массивами; их использование требует переписывания некоторого кода, в основном внутренних циклов , с использованием NumPy.
Использование NumPy в Python дает функциональность, сравнимую с MATLAB , поскольку они оба интерпретируются, [18] и они оба позволяют пользователю писать быстрые программы, поскольку большинство операций работают с массивами или матрицами, а не со скалярами . Для сравнения, MATLAB может похвастаться большим количеством дополнительных наборов инструментов, в частности Simulink , тогда как NumPy внутренне интегрирован с Python, более современным и полным языком программирования . Кроме того, доступны дополнительные пакеты Python; SciPy — это библиотека, которая добавляет больше функций, подобных MATLAB, а Matplotlib — это пакет для построения графиков , который обеспечивает функции построения графиков, подобные MATLAB. Хотя Matlab может выполнять операции с разреженными матрицами, numpy сам по себе не может выполнять такие операции и требует использования библиотеки scipy.sparse. Внутри MATLAB и NumPy используются BLAS и LAPACK для эффективных вычислений линейной алгебры .
Python Привязки широко используемой компьютерного зрения библиотеки OpenCV используют массивы NumPy для хранения данных и работы с ними. Поскольку изображения с несколькими каналами просто представляются как трехмерные массивы, индексирование, нарезка или маскирование с помощью других массивов являются очень эффективными способами доступа к определенным пикселям изображения. Массив NumPy как универсальная структура данных в OpenCV для изображений, извлеченных точек функций , ядер фильтров и многого другого значительно упрощает рабочий процесс программирования и отладки . [ нужна ссылка ]
Важно отметить, что многие операции NumPy снимают глобальную блокировку интерпретатора , что позволяет выполнять многопоточную обработку. [19]
NumPy также предоставляет C API, который позволяет коду Python взаимодействовать с внешними библиотеками, написанными на языках низкого уровня. [20]
Структура данных ndarray
[ редактировать ]Основная функциональность NumPy — это «ndarray», для n -мерного массива, структура данных . Эти массивы представляют собой пошаговые представления о памяти. [9] В отличие от встроенной в Python структуры данных списка, эти массивы имеют однородную типизацию: все элементы одного массива должны быть одного типа.
Такие массивы также можно просматривать в буферах памяти, выделенных расширениями C / C++ , Python и Fortran для интерпретатора CPython, без необходимости копировать данные, что обеспечивает определенную степень совместимости с существующими числовыми библиотеками. Эта функциональность используется пакетом SciPy, в который входит ряд таких библиотек (в частности, BLAS и LAPACK). NumPy имеет встроенную поддержку ndarrays , отображаемых в памяти . [9]
Ограничения
[ редактировать ]Вставка или добавление записей в массив не так тривиальна, как со списками Python.
np.pad(...)
Процедура расширения массивов фактически создает новые массивы желаемой формы и значений заполнения, копирует данный массив в новый и возвращает его.
NumPy np.concatenate([a1,a2])
операция фактически не связывает два массива, а возвращает новый, последовательно заполненный записями из обоих заданных массивов.
Изменение размерности массива с помощью np.reshape(...)
возможно только до тех пор, пока количество элементов в массиве не изменится.
Эти обстоятельства возникают из-за того, что массивы NumPy должны представлять собой представления в смежных буферах памяти .
Алгоритмы , которые невозможно выразить в виде векторизованной операции, обычно работают медленно, поскольку они должны быть реализованы на «чистом Python», тогда как векторизация может увеличить сложность памяти для некоторых операций с константной до линейной, поскольку необходимо создавать временные массивы размером с входы. Компиляция числового кода во время выполнения была реализована несколькими группами, чтобы избежать этих проблем; решения с открытым исходным кодом, которые взаимодействуют с NumPy, включают numexpr [21] и Нумба . [22] Cython и Pythran являются альтернативами статической компиляции.
Многие современные крупномасштабные научные вычислительные приложения предъявляют требования, превосходящие возможности массивов NumPy. компьютера Например, массивы NumPy обычно загружаются в память , емкость которой может оказаться недостаточной для анализа больших наборов данных . Кроме того, операции NumPy выполняются на одном процессоре . Однако многие операции линейной алгебры можно ускорить, выполняя их на кластерах ЦП или специализированном оборудовании, таком как графические процессоры и ТПУ многие приложения глубокого обучения , на которые полагаются . В результате за последние годы в научной экосистеме Python появилось несколько альтернативных реализаций массивов, таких как Dask для распределенных массивов и TensorFlow или JAX для вычислений на графических процессорах. Из-за своей популярности они часто реализуют подмножество NumPy API или имитируют его, так что пользователи могут изменить реализацию своего массива с минимальными изменениями в своем коде. [3] Библиотека с именем CuPy , [23] ускоренный Nvidia от инфраструктурой CUDA , он также продемонстрировал потенциал для более быстрых вычислений, являясь « заменой » NumPy. [24]
Примеры
[ редактировать ]import numpy as np
from numpy.random import rand
from numpy.linalg import solve, inv
a=np.array([[1,2,3,4],[3,4,6,7],[5,9,0,5]])
a.transpose()
Основные операции
[ редактировать ]>>> 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)
>>>
>>> # Functions can take both numbers and arrays as parameters.
>>> np.sin(1)
0.8414709848078965
>>> np.sin(np.array([1, 2, 3]))
array([0.84147098, 0.90929743, 0.14112001])
Линейная алгебра
[ редактировать ]>>> 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(f'Nearest point to q: {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(f'Nearest point to q: {points[minIdx]}')
Nearest point to q: [3 4 4]
F2PY
[ редактировать ]Быстро переносите собственный код для более быстрых сценариев. [25] [26] [27]
! Python Fortran native code call example
! f2py -c -m foo *.f90
! Compile Fortran into python named module using intent statements
! Fortran subroutines only not functions--easier than JNI with C wrapper
! requires gfortran and make
subroutine ftest(a, b, n, c, d)
implicit none
integer, intent(in) :: a, b, n
integer, intent(out) :: c, d
integer :: i
c = 0
do i = 1, n
c = a + b + c
end do
d = (c * n) * (-1)
end subroutine ftest
>>> import numpy as np
>>> import foo
>>> a = foo.ftest(1, 2, 3) # or c,d = instead of a.c and a.d
>>> print(a)
(9,-27)
>>> help('foo.ftest') # foo.ftest.__doc__
См. также
[ редактировать ]- Программирование массивов
- Список программного обеспечения для численного анализа
- Теано (программное обеспечение)
- Матплотлиб
- Фортран
- Порядок строк и столбцов
Ссылки
[ редактировать ]- ^ «Выпуск 2.0.1» . 21 июля 2024 г. Проверено 23 июля 2024 г.
- ^ «NumPy — NumPy» . numpy.org . Разработчики NumPy.
- ^ Перейти обратно: а б Чарльз Р. Харрис; К. Джаррод Миллман; Стефан Дж. ван дер Вальт; и др. (16 сентября 2020 г.). «Программирование массивов с помощью NumPy» (PDF) . Природа . 585 (7825): 357–362. arXiv : 2006.10256 . дои : 10.1038/S41586-020-2649-2 . ISSN 1476-4687 . ПМЦ 7759461 . ПМИД 32939066 . Викиданные Q99413970 .
- ^ «Проекты, спонсируемые NumFOCUS» . NumFOCUS . Проверено 25 октября 2021 г.
- ^ «Индексирование — Руководство по NumPy v1.20» . numpy.org . Проверено 06 апреля 2021 г.
- ^ Перейти обратно: а б с Миллман, К. Джаррод; Айвазис, Михаил (2011). «Python для ученых и инженеров» . Вычисления в науке и технике . 13 (2): 9–12. Бибкод : 2011CSE....13b...9M . дои : 10.1109/MCSE.2011.36 . Архивировано из оригинала 19 февраля 2019 г. Проверено 7 июля 2014 г.
- ^ Трэвис Олифант (2007). «Python для научных вычислений» (PDF) . Вычисления в науке и технике . Архивировано из оригинала (PDF) 14 октября 2013 г. Проверено 12 октября 2013 г.
- ^ Перейти обратно: а б с д Дэвид Ашер; Поль Ф. Дюбуа; Конрад Хинсен; Джим Хугунин; Трэвис Олифант (1999). «Численный Python» (PDF) .
- ^ Перейти обратно: а б с д ван дер Вальт, Стефан; Кольбер, С. Крис; Варокво, Гаэль (2011). «Массив NumPy: структура для эффективных численных вычислений». Вычисления в науке и технике . 13 (2). IEEE: 22. arXiv : 1102.1523 . Бибкод : 2011CSE....13b..22V . дои : 10.1109/MCSE.2011.37 . S2CID 16907816 .
- ^ «Домашняя страница Numarray» . Проверено 24 июня 2006 г.
- ^ Трэвис Э. Олифант (7 декабря 2006 г.). Руководство по NumPy . Проверено 2 февраля 2017 г.
- ^ Трэвис Олифант и другие разработчики SciPy. «[Numpy-discussion] Статус числового значения» . Проверено 2 февраля 2017 г.
- ^ «Файлы NumPy Sourceforge» . Проверено 24 марта 2008 г.
- ^ «History_of_SciPy — дамп вики SciPy» . scipy.github.io .
- ^ «Примечания к выпуску NumPy 1.5.0» . Проверено 29 апреля 2011 г.
- ^ «Блог о статусе PyPy: финансирование и обновление статуса NumPy» . Проверено 22 декабря 2011 г.
- ^ «Статус NumPyPy» . Проверено 19 декабря 2023 г.
- ^ Сообщество SciPy. «NumPy для пользователей Matlab» . Проверено 2 февраля 2017 г.
- ^ "numpy примечания к выпуску" .
- ^ МакКинни, Уэс (2014). «Основы NumPy: массивы и векторизованные вычисления». Python для анализа данных (первое издание, третье издание). О'Рейли. п. 79. ИСБН 978-1-449-31979-3 .
- ^ Франческ Альтернативный. "числоэкспр" . Гитхаб . Проверено 8 марта 2014 г.
- ^ «Нумба» . Проверено 8 марта 2014 г.
- ^ Шохей Хидо — CuPy: NumPy-совместимая библиотека для графического процессора — PyCon 2018 , заархивировано из оригинала 21 декабря 2021 г. , получено 11 мая 2021 г.
- ^ Энчев, Питер Андреас (23 июля 2019 г.). «Ускорение CuPy на одном графическом процессоре» . Середина . Проверено 11 мая 2021 г.
- ^ «Документы F2PY из NumPy» . НумПи . Проверено 18 апреля 2022 г.
- ^ Уорти, Гай (3 января 2022 г.). «Питон против Фортрана» . Гай Уорти . Гай Уорти . Проверено 18 апреля 2022 г.
- ^ Шелл, Скотт. «Написание быстрых подпрограмм Фортрана для Python» (PDF) . Инженерный отдел УЦСБ . Калифорнийский университет, Санта-Барбара . Проверено 18 апреля 2022 г.
Дальнейшее чтение
[ редактировать ]- Брессерт, Эли (2012). Scipy и Numpy: обзор для разработчиков . О'Рейли. ISBN 978-1-4493-0546-8 .
- МакКинни, Уэс (2017). Python для анализа данных: обработка данных с помощью Pandas, NumPy и IPython (2-е изд.). Севастополь: О'Рейли. ISBN 978-1-4919-5766-0 .
- ВандерПлас, Джейк (2016). «Введение в NumPy». Справочник по Python Data Science: основные инструменты для работы с данными . О'Рейли. стр. 33–96. ISBN 978-1-4919-1205-8 .
Внешние ссылки
[ редактировать ]- Языки программирования массивов
- Бесплатное математическое программное обеспечение
- Бесплатное научное программное обеспечение
- Программное обеспечение для численного анализа для Linux
- Программное обеспечение для численного анализа для macOS
- Программное обеспечение для численного анализа для Windows
- Языки числового программирования
- Научные библиотеки Python (язык программирования)
- Программное обеспечение, использующее лицензию BSD