Jump to content

NumPy

(Перенаправлено с Numpy )
Оригинальный автор(ы) Трэвис Олифант
Разработчик(и) Общественный проект
Первоначальный выпуск Как Numeric, 1995 ( 1995 ) ; как NumPy, 2006 ( 2006 )
Стабильная версия
2.0.1 [1] / 21 июля 2024 г .; 6 дней назад ( 21 июля 2024 г. )
Репозиторий
Написано в Питон , С
Операционная система Кросс-платформенный
Тип Численный анализ
Лицензия БСД [2]
Веб-сайт бестолковый .org  Edit this on Wikidata

NumPy (произносится / ˈ n ʌ m p / 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]

В начале 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]

Быстро переносите собственный код для более быстрых сценариев. [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__

См. также

[ редактировать ]
  1. ^ «Выпуск 2.0.1» . 21 июля 2024 г. Проверено 23 июля 2024 г.
  2. ^ «NumPy — NumPy» . numpy.org . Разработчики NumPy.
  3. ^ Перейти обратно: а б Чарльз Р. Харрис; К. Джаррод Миллман; Стефан Дж. ван дер Вальт; и др. (16 сентября 2020 г.). «Программирование массивов с помощью NumPy» (PDF) . Природа . 585 (7825): 357–362. arXiv : 2006.10256 . дои : 10.1038/S41586-020-2649-2 . ISSN   1476-4687 . ПМЦ   7759461 . ПМИД   32939066 . Викиданные   Q99413970 .
  4. ^ «Проекты, спонсируемые NumFOCUS» . NumFOCUS . Проверено 25 октября 2021 г.
  5. ^ «Индексирование — Руководство по NumPy v1.20» . numpy.org . Проверено 06 апреля 2021 г.
  6. ^ Перейти обратно: а б с Миллман, К. Джаррод; Айвазис, Михаил (2011). «Python для ученых и инженеров» . Вычисления в науке и технике . 13 (2): 9–12. Бибкод : 2011CSE....13b...9M . дои : 10.1109/MCSE.2011.36 . Архивировано из оригинала 19 февраля 2019 г. Проверено 7 июля 2014 г.
  7. ^ Трэвис Олифант (2007). «Python для научных вычислений» (PDF) . Вычисления в науке и технике . Архивировано из оригинала (PDF) 14 октября 2013 г. Проверено 12 октября 2013 г.
  8. ^ Перейти обратно: а б с д Дэвид Ашер; Поль Ф. Дюбуа; Конрад Хинсен; Джим Хугунин; Трэвис Олифант (1999). «Численный Python» (PDF) .
  9. ^ Перейти обратно: а б с д ван дер Вальт, Стефан; Кольбер, С. Крис; Варокво, Гаэль (2011). «Массив NumPy: структура для эффективных численных вычислений». Вычисления в науке и технике . 13 (2). IEEE: 22. arXiv : 1102.1523 . Бибкод : 2011CSE....13b..22V . дои : 10.1109/MCSE.2011.37 . S2CID   16907816 .
  10. ^ «Домашняя страница Numarray» . Проверено 24 июня 2006 г.
  11. ^ Трэвис Э. Олифант (7 декабря 2006 г.). Руководство по NumPy . Проверено 2 февраля 2017 г.
  12. ^ Трэвис Олифант и другие разработчики SciPy. «[Numpy-discussion] Статус числового значения» . Проверено 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» . Проверено 19 декабря 2023 г.
  18. ^ Сообщество SciPy. «NumPy для пользователей Matlab» . Проверено 2 февраля 2017 г.
  19. ^ "numpy примечания к выпуску" .
  20. ^ МакКинни, Уэс (2014). «Основы NumPy: массивы и векторизованные вычисления». Python для анализа данных (первое издание, третье издание). О'Рейли. п. 79. ИСБН  978-1-449-31979-3 .
  21. ^ Франческ Альтернативный. "числоэкспр" . Гитхаб . Проверено 8 марта 2014 г.
  22. ^ «Нумба» . Проверено 8 марта 2014 г.
  23. ^ Шохей Хидо — CuPy: NumPy-совместимая библиотека для графического процессора — PyCon 2018 , заархивировано из оригинала 21 декабря 2021 г. , получено 11 мая 2021 г.
  24. ^ Энчев, Питер Андреас (23 июля 2019 г.). «Ускорение CuPy на одном графическом процессоре» . Середина . Проверено 11 мая 2021 г.
  25. ^ «Документы F2PY из NumPy» . НумПи . Проверено 18 апреля 2022 г.
  26. ^ Уорти, Гай (3 января 2022 г.). «Питон против Фортрана» . Гай Уорти . Гай Уорти . Проверено 18 апреля 2022 г.
  27. ^ Шелл, Скотт. «Написание быстрых подпрограмм Фортрана для 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 .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 12461b9098e57496a206e188082a748e__1720832580
URL1:https://arc.ask3.ru/arc/aa/12/8e/12461b9098e57496a206e188082a748e.html
Заголовок, (Title) документа по адресу, URL1:
NumPy - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)