NumPy

С Википедије, слободне енциклопедије

NumPy је проширење на Пајтон програмском језику, додајући подршку за велике, вишедимензионалне низове и матрице, заједно са великим библиотекама математичких функција на високом нивоу које послују на овим низовима. Предак NumPy је оригинално створио Јим Хугунин уз доприносиме неколико других програмера. У 2005. години, Тревис Олифант створио је NumPy укључивањем карактеристика конкурената Нумереј у нумеричке, са великим изменама. NumPy је отвореног кода и има много сарадника.

Особине[уреди | уреди извор]

NumPy користи CPython референтну имплементацију Пајтона, која је неоптимални бајткодни преводилац. Математички алгоритми написани за ову верзију Пајтона често раде много спорије него компилирани еквиваленати. NumPy решава проблеме спорости делом путем обезбеђивања мултидимензионалних матрица и функција и оператора који раде ефикасно на низовима, што захтева писање неког кода, углавном за мали број унутрашњих петљи користећи NumPy. Тако је сваки алгоритам који се може изразити првенствено као операција на низовима и матрицама може да ради готово једнако брзо као еквивалентне C код.[1]

Користећење NumPy у Пајтону производи функционалност која је упоредива са MATLABом, јер оба интерпретирају код и омогућавају кориснику да брзо напише програме док се већина операција извршава на низовима и матрицама уместо скаларима. У поређењу МАТЛАБ има велики број додатних кутија за алате, посебно Симулинк; док је NumPy суштински интегрисан са Пајтоном, модернији, потпун и отворен језик изворног програмирања. Штавише, комплементарни Пајтон пакети су доступни; SciPy је библиотека која додаје мноштво Матлабу сличних функционалности и Матплотлиб је пакет за скицирање који омогућава МАТЛАБ сличнан приказ резултата и прегледа података. Интерно се оба језика, МАТЛАБ и NumPy, ослањају на BLAS и LAPACK за ефикасна линеарно алгебарска израчунавања.

Ndarray структура података[уреди | уреди извор]

Језгро функционалности NumPy-а је његова "ndarray", за н-димензионални низ, структуре података. Ови низови су ставови о меморији.[2]  За разлику од прављења структури листа података у Пајтону (који, упркос имену, представља Динамички низ), ови низови су хомогено откуцани: Сви елементи једног низа морају бити истог типа.

Такви низови могу бити виђени и у меморији бафера које додељује C, C++, C-Пајтон и Фортран проширења на C-Пајтон преводиоца, без потребе за копирањем података, дајући степен компатибилности са постојећим нумеричким библиотекама. Ова функционалност је експлоатисана од стране SciPy пакета, који обавија велики број таквих библиотека (посебно BLAS и LAPACK). NumPy има уграђену подршку за меморијско-мапирање ndarray-а. [2]

Ограничења[уреди | уреди извор]

NumPy - ови низови морају бити прегледи на суседне меморијске бафере. Пакет замена се зове Блазе, који покушава да превазиђе ово ограничење.[3]

Алгоритми који нису изразити као векторске операције обично раде споро, јер они морају бити имплементирани у "чист Пајтон", док векторизацију може повећати сложеност меморије неких операција из константне у линеарне, јер се морају створити привремени низови који су велики као улази. Дужина трајања компилације нумеричког кода је спроведена од стране неколико група како би се избегли ови проблеми; отворени код решења који ради са  NumPy укључује scipy.weave , numexpr[4] и Numba.[5]Цајтон је статичко-састављање алтернатива на њих.

Примери[уреди | уреди извор]

Стварање поретка
>>> import numpy as np
>>> x = np.array([1, 2, 3])
>>> x
array([1, 2, 3])
>>> y = np.arange(10) # like Python's range, 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) # create a 3x3 random matrix
>>> 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([[ 3.98732789, 2.47702609, 4.71167924],
       [  9.24410671,   5.5240412 ,  10.6468792 ],
       [ 10.38136661,   8.44968437,  15.17639591]])
>>> a @ c # Starting with Python 3.5 and NumPy 1.10
array([[ 3.98732789, 2.47702609, 4.71167924],
       [  9.24410671,   5.5240412 ,  10.6468792 ],
       [ 10.38136661,   8.44968437,  15.17639591]])

 Историја[уреди | уреди извор]

Пајтон програмски језик није првобитно намењен нумеричком рачунарству, али је привукао пажњу научне / инжењерске заједнице, тако да је специјална интересна група под називом матрица-сиг основана 1995. године са циљем дефинисања низа рачунарских пакета. Међу њеним члановима је био дизајнер и одржавалац Пајтона Гвидо ван Росум, који је реализовао проширења Пајтонове синтаксе (посебно синтаксе индексирања) да би се олакшали прорачуни на низовима.[6] Имплементацију пакета матрице је урадио Џим Фултон, а затим генерализовао Џим Хугунин да би постала нумеричка,[6] као и различито називане Пајтонове нумеричке екстензије или NumPy.[7][8] Хугунин, дипломирани студент на МИТ[8] придружио се CNRI да ради на Ј-Пајтону 1997.[6] Касније је Паул Дубојс из LLNL преузео посао одржаваоца [8]. Други рани доприносиоци су Давид Ашера, Конрада Хинсена и Трависа Олифанта.[8]

Нови пакет под називом Numarray је написан као флексибилнија замену за Numeric.[2] Као Нумерички, сада је застарео.[9] Numarray је имао брже операције за велике низове, али је спорији него нумерички на малим, па временом оба пакета су коришћени за различите случајеве. Последња верзија нумеричка в24.2 пуштена је на слободу 11. новембра 2005. године и numarray в1.5.2 пуштен је 24. августа 2006.[10]

Постојала је жеља да се Бројне пребаце на стандардне библиотеке Пајтона, али Гвидо ван Росум (аутор Пајтона) је био сасвим јасан да код није био одржив.

Почетком 2005. године, NumPy-ев програмер Тревис Олифант хтео је да уједини заједнице око једног низа пакета и подржи Numarray-ве функције у нумеричке, ослобађајући резултат као NumPy 1.0 у 2006. години.[2] Овај нови пројекат је део SciPy-а. Да бисте избегли инсталирање великог SciPy пакета само да би добили низ објеката, овај нови пакет је издвојен и назван

Ослобађајућа верзија NumPy-а 1.5.1  је компатибилана са верзијама Пајтон 2.4-2.7 и 3.1-3.2. Подршка за Пајтон 3 додаје се у 1.5.0.[11] У 2011. години, PyPy почео је развој на имплементацији numpy АПИ за PyPy. [12] То још увек није у потпуности компатибилан са NumPy.[13]

Референце[уреди | уреди извор]

  1. ^ "SciPy PerformancePython" Архивирано на сајту Wayback Machine (13. јануар 2015).
  2. ^ а б в г Stéfan van der Walt, S. Chris Colbert and Gaël Varoquaux (2011).
  3. ^ "Blaze 0.4.1 Documentation" Архивирано на сајту Wayback Machine (8. фебруар 2015).
  4. ^ Francesc Alted. "numexpr".
  5. ^ "Numba".
  6. ^ а б в Millman, K. Jarrod; Aivazis, Michael (2011).
  7. ^ Travis Oliphant (2007).
  8. ^ а б в г David Ascher; Paul F. Dubois; Konrad Hinsen; Jim Hugunin; Travis Oliphant (1999).
  9. ^ "Numarray Homepage".
  10. ^ "NumPy Sourceforge Files".
  11. ^ "NumPy 1.5.0 Release Notes".
  12. ^ "PyPy Status Blog: Numpy funding and status update".
  13. ^ "NumPyPy Status".