Кіріспе

Сандық бағдарламалау үшін Python кітапханасы

NumPy (айтылуы '/nʌmpaɪ' NUMpy) – Python бағдарламалау тілі үшін жасалған кітапхана, үлкен, көп өлшемді массивтер мен матрицаларды қолдауға, сондай-ақ осы массивтермен жұмыс істеуге арналған жоғары деңгейдегі математикалық функциялардың кең жиынтығын қосады. NumPy-дің алдындағы Numeric кітапханасын Джим Хагунин және басқа да бірнеше әзірлеушілер бірлесіп құрған. 2005 жылы Трэвис Олифант Numeric кітапханасына Numarray мүмкіндіктерін қосып, кеңейтілген өзгерістер енгізу арқылы NumPy-ді жасады. NumPy – ашық кодты бағдарламалық құрал және көптеген үлес қосушылары бар. NumPy NumFOCUS ұйымының қаржылық қолдауындағы жоба.

матрицалық-сиг

Python бағдарламалау тілі бастапқыда сандық есептеулер үшін жасалмаған, бірақ ғылыми және инженерлік қауымдастықтың назарын ерте тартты. 1995 жылы матрицалық операцияларға арналған топ (SIG) құрылды, мақсаты – массивтік есептеу пакетін анықтау болды; оның мүшелерінің арасында Python дизайнының авторы және бағдарламаны қолдаушы Гвидо ван Россум болды, ол массивтік есептеуді жеңілдету үшін Python синтаксисін (әсіресе индекстеу синтаксисін) кеңейтті. (сонымен қатар "Сандық Python кеңейтімдері" немесе "NumPy" деп белгілі), APL тілдер отбасы, Basis, MATLAB, FORTRAN, S және S+ сияқты тілдердің ықпалымен дамыды. Массачусетс технология институтының (MIT) аспиранты Хугуниннің сөзіне сәйкес, Numarray үлкен массивтермен жұмыс істегенде Numeric-тен жылдам болды, бірақ кішкентай массивтермен жұмыс істегенде баяу болды, сондықтан қысқа мерзімге екі пакет те әртүрлі жағдайларда параллель қолданылды. Numeric-тің соңғы нұсқасы (v24.2) 2005 жылдың 11 қарашасында, ал numarray-тің соңғы нұсқасы (v1.5.2) 2006 жылдың 24 тамызында жарияланды. Numeric-ті Python стандартты кітапханасына қосуға ниет болған, бірақ Гвидо ван Россум кодты сол кездегі күйінде қолдау мүмкін емес деп шешті.

Саны

2005 жылдың басында NumPy әзірлеушісі Трэвис Олифант қауымдастықты бір ғана массивтік пакеттің айналасына біріктіруді қалап, Numarray мүмкіндіктерін Numeric-ке көшірді және нәтижені 2006 жылы NumPy 1.0 ретінде жариялады. 2011 жылы PyPy, PyPy үшін NumPy API-дің іске асырылуын дамытуға кірісті. 2023 жылға дейін ол әлі толыққанды NumPy-мен үйлесімді емес.

Ерекшеліктері

NumPy Python-ның CPython анықтамалық нұсқасын қолдайды, ол оптимизацияланбаған байт-код интерпретаторы болып табылады. Python-ның осы нұсқасы үшін жазылған математикалық алгоритмдер компилятордың оптимизациясы болмағандықтан, компиляцияланған баламаларына қарағанда әлдеқайда баяу жұмыс істейді. NumPy баяулық мәселесін көп өлшемді массивтер, сондай-ақ массивтерде тиімді жұмыс істейтін функциялар мен операторларды ұсына отырып, ішінара шешеді. Бұларды пайдалану үшін кейбір кодты, әсіресе ішкі циклдарды NumPy арқылы қайта жазу қажет. NumPy-ді Python-да пайдалану MATLAB-қа ұқсас функционалдық мүмкіндіктерді береді, себебі екеуі де интерпретацияланады және екеуі де пайдаланушыға операциялардың көп бөлігі массивтермен немесе матрицалармен орындалса, жылдам бағдарламалар жазуға мүмкіндік береді. Қарама-қарсылығы, MATLAB Simulink сияқты көптеген қосымша құралдар жиынтығымен мақтана алады, ал NumPy Python-мен, көбірек қазіргі заманғы және толыққанды бағдарламалау тілімен тікелей байланысты. Сонымен қатар, толықтыратын Python пакеттері бар; SciPy – MATLAB сияқты функционалдық мүмкіндіктерді кеңейтетін кітапхана, ал Matplotlib – MATLAB сияқты график салу мүмкіндіктерін ұсынатын пакет. MATLAB сирек матрицалық операцияларды орындай алса да, NumPy жалғыз өзі мұндай операцияларды орындай алмайды және scipy.sparse кітапханасын пайдалануды қажет етеді. Ішкі жағынан, MATLAB және NumPy екеуі де тиімді сызықтық алгебра есептеулері үшін BLAS және LAPACK-қа сенеді. Көп қолданылатын компьютерлік көру кітапханасы OpenCV-нің Python байланыстары деректерді сақтау және оларды өңдеу үшін NumPy массивтерін пайдаланады. Көп арналы кескіндер үш өлшемді массивтер ретінде бейнеленгендіктен, индекстеу, бөліп алу немесе басқа массивтермен маскалау кескіннің нақты пиксельдеріне қол жеткізудің өте тиімді тәсілдері болып табылады. NumPy массиві OpenCV-дегі кескіндер, ізделген ерекшеліктер нүктелері, сүзгі ядролары және т.б. үшін әмбебап деректер құрылымы ретінде бағдарламалау процесін және қателерді жоюды ыңғайлы етеді. Маңыздысы, көптеген NumPy операциялары жаһандық интерпретаторды босатады, бұл көп жіпті өңдеуге мүмкіндік береді. NumPy сонымен қатар C API-ін ұсынады, ол Python кодына төменгі деңгейдегі тілдерде жазылған сыртқы кітапханалармен өзара әрекеттесуге мүмкіндік береді.

Сызықтардың деректер құрылымы

NumPy-дің негізгі функционалдығы – оның n өлшемді массив үшін "ndarray" дерек құрылымы. Бұл массивтер жадқа тікелей қол жеткізуді қамтамасыз етеді. Python-ның кіріктірілген тізім дерек құрылымынан өзгеше, бұл массивтер біртекті типтелген: бір массивтің барлық элементтері бірдей типте болуы керек. Мұндай массивтер C/C++, Python және Fortran кеңейтімдері арқылы CPython интерпретаторына бөлінген жад буферлеріне сілтеме жасауға мүмкіндік береді, деректерді көшіру қажеттілігін жоққа шығарады және қолданыстағы сандық кітапханалармен үйлесімділікті қамтамасыз етеді. SciPy пакеті осы функционалдықты пайдаланады, ол BLAS және LAPACK сияқты көптеген кітапханаларды қамтиды. NumPy жадқа бейімделген массивтерді және Numba-ны қолдайды. Cython және Pythran – бұл статикалық компиляцияға баламалы құралдар. Көптеген қазіргі заманғы, кең ауқымды ғылыми есептеулерге арналған қолданбалардың талаптары NumPy массивтерінің мүмкіндіктерін асып түседі. Мысалы, NumPy массивтері әдетте компьютердің жадына жүктеледі, бұл үлкен деректер жиынтығын талдау үшін жеткіліксіз болуы мүмкін. Сонымен қатар, NumPy операциялары бір процессорда орындалады. Дегенмен, көптеген сызықтық алгебра операцияларын процессорлар кластерінде немесе GPU және TPU сияқты арнайы аппараттық құралдарда орындау арқылы үдетуге болады, олар көптеген терең оқыту қолданбаларында қолданылады. Осының нәтижесінде, соңғы жылдары ғылыми Python экожүйесінде Dask (бөлінген массивтер үшін) және TensorFlow немесе JAX (GPU-дағы есептеулер үшін) сияқты бірнеше балама массивтер пайда болды. Олардың танымалдылығының арқасында, олар көбінесе NumPy API-нің бір бөлігін іске асырады немесе оны имитациялайды, бұл пайдаланушыларға кодта минималды өзгерістер енгізу арқылы массивтің іске асырылуын өзгертуге мүмкіндік береді. Nvidia-ның CUDA фреймворкімен үдетілген және NumPy-дің "толыққанды алмастырушысы" болатын құрал, жылдам есептеулерге қабілетті екенін көрсетті.