{"id":29176,"date":"2023-03-09T15:31:00","date_gmt":"2023-03-09T14:31:00","guid":{"rendered":"https:\/\/nearshore-it.eu\/artykuly\/numpy-wstep-do-biblioteki-python\/"},"modified":"2024-10-29T15:42:36","modified_gmt":"2024-10-29T14:42:36","slug":"numpy-wstep-do-biblioteki-python","status":"publish","type":"post","link":"https:\/\/nearshore-it.eu\/pl\/artykuly\/numpy-wstep-do-biblioteki-python\/","title":{"rendered":"NumPy \u2013 wst\u0119p do biblioteki w j\u0119zyku Python"},"content":{"rendered":"\n<div class=\"table-of-contents\">\n    <p class=\"title\"><\/p>\n    <ol>\n                    <li><a href=\"#Czym-w\u0142a\u015bciwie-jest-biblioteka-Python?\">1.  Czym w\u0142a\u015bciwie jest biblioteka Python?<\/a><\/li>\n                    <li><a href=\"#NumPy\">2.  Do czego s\u0142u\u017cy pakiet NumPy?<\/a><\/li>\n                    <li><a href=\"#Instalacja-\">3.  Instalacja NumPy<\/a><\/li>\n                    <li><a href=\"#Czym-s\u0105-tablice-w-NumPy?\">4.  Czym s\u0105 tablice w NumPy?<\/a><\/li>\n                    <li><a href=\"#R\u00f3\u017cnica-mi\u0119dzy-ndarray-a-array\">5.  R\u00f3\u017cnica mi\u0119dzy ndarray a array<\/a><\/li>\n                    <li><a href=\"#Funkcje-wbudowane\">6.  Funkcje wbudowane<\/a><\/li>\n                    <li><a href=\"#Por\u00f3wnanie-czasu-wykonania-funkcji-w-NumPy-i-bez-u\u017cycia-tej-biblioteki\">7.  Por\u00f3wnanie czasu wykonania funkcji w NumPy i bez u\u017cycia tej biblioteki<\/a><\/li>\n                    <li><a href=\"#Zalety i wady korzystania z NumPy\">8.  Zalety i wady korzystania z NumPy<\/a><\/li>\n                    <li><a href=\"#Podsumowanie\">9.  Podsumowanie &#8211; FAQ<\/a><\/li>\n            <\/ol>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"Czym-w\u0142a\u015bciwie-jest-biblioteka-Python?\">Czym w\u0142a\u015bciwie jest biblioteka Python?<\/h2>\n\n\n\n<p>Je\u017celi od pewnego czasu programujesz w j\u0119zyku Python, na pewno korzystasz z r\u00f3\u017cnych bibliotek, kt\u00f3re wspieraj\u0105 implementacj\u0119 rozwi\u0105za\u0144 i zwi\u0119kszaj\u0105 wydajno\u015b\u0107 zar\u00f3wno twoj\u0105, jak i funkcjonalno\u015bci, nad kt\u00f3rymi pracujesz. Najpopularniejsze biblioteki w j\u0119zyku Python to m.in. Pandas, NumPy, TensorFlow czy SciPy. <br><br>Biblioteka w j\u0119zyku Python to w du\u017cym uproszczeniu zbi\u00f3r funkcji i metod, kt\u00f3re stworzono w celu u\u0142atwienia implementacji rozwi\u0105za\u0144. Funkcje te mo\u017cna w \u0142atwy spos\u00f3b wykorzysta\u0107 w programie, nie trac\u0105c czasu na tworzenie wszystkiego od zera. To pewnego rodzaju modu\u0142y, kt\u00f3re zosta\u0142y stworzone w celu u\u0142atwienia pracy z problemami konkretnych obszar\u00f3w nauki czy biznesu.<\/p>\n\n\n\n<p>Wiele bibliotek Python u\u017cywanych jest np. na potrzeby medycyny (<strong>MedPy<\/strong>), przemys\u0142u ci\u0119\u017ckiego, lotnictwa, bankowo\u015bci czy telekomunikacji i wojskowo\u015bci. Biblioteki mog\u0105 tak\u017ce wspiera\u0107 w\u0105skie specjalizacje obszaru IT, takie jak przetwarzanie i wizualizacja zbior\u00f3w danych (<a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/biblioteki-python-pandas\/\" data-type=\"link\" data-id=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/biblioteki-python-pandas\"><strong>Pandas<\/strong>,<\/a> <strong><a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/biblioteka-matplotlib\/\" data-type=\"link\" data-id=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/biblioteka-matplotlib\">Matplotlib<\/a><\/strong>), sieci neuronowe (<strong>TensorFlow<\/strong>, <strong>PyTorch<\/strong>), a tak\u017ce obliczenia naukowe (<strong>SciPy<\/strong>).<\/p>\n\n\n\n<p>Ka\u017cda biblioteka posiada dokumentacj\u0119, kt\u00f3ra obja\u015bnia mo\u017cliwo\u015bci wykorzystania zawartych w niej funkcji i metod. Dokumentacja zazwyczaj zawiera te\u017c fragmenty kodu, kt\u00f3re po niewielkim dostosowaniu mo\u017cna z powodzeniem u\u017cy\u0107 we w\u0142asnym projekcie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"NumPy\">Do czego s\u0142u\u017cy pakiet NumPy?<\/h2>\n\n\n\n<p>Jak zapewne wiesz, analiza danych (ang. <strong>Data Science<\/strong>) staje si\u0119 z roku na rok coraz popularniejsza, a w momencie pisania tego artyku\u0142u jej wykorzystanie sta\u0142o si\u0119 w zasadzie powszechne w wielu obszarach biznesu. Obok r\u00f3\u017cnych proces\u00f3w dotycz\u0105cych przygotowania danych czy wizualizacji efekt\u00f3w stoj\u0105 metody obliczeniowe, kt\u00f3re wspomagaj\u0105 uzyskanie realnej warto\u015bci z zebranych danych. W tym artykule skupiam si\u0119 na danych numerycznych.<\/p>\n\n\n\n<p>J\u0119zyki programowania, do kt\u00f3rych nale\u017cy Python, wspomagaj\u0105 naukowc\u00f3w, analityk\u00f3w i programist\u00f3w w implementacji rozwi\u0105za\u0144 i osi\u0105ganiu rezultat\u00f3w, kt\u00f3re z powodzeniem mog\u0105 zosta\u0107 u\u017cyte w procesach decyzyjnych wy\u017cszego szczebla i mie\u0107 realny wp\u0142yw na otaczaj\u0105cy nas \u015bwiat. W przypadku wspomnianych metod obliczeniowych jedn\u0105 z najpopularniejszych bibliotek jest w\u0142a\u015bnie NumPy (<strong>Numeric Python<\/strong>). Jak nazwa wskazuje, skupia si\u0119 ona g\u0142\u00f3wnie na wsparciu pracy z danymi numerycznymi i umo\u017cliwia efektywne i wydajne dokonywanie operacji na macierzach, tablicach czy wektorach, kt\u00f3re zawieraj\u0105 elementy tego samego typu. Po wprowadzeniu teoretycznym skupimy si\u0119 bardziej na cz\u0119\u015bci praktycznej i bazuj\u0105c na prostych przyk\u0142adach, zapoznasz si\u0119 z mo\u017cliwo\u015bciami biblioteki NumPy. Zanim to jednak zrobimy, upewnij si\u0119, \u017ce biblioteka NumPy jest u ciebie zainstalowana.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Instalacja-\">Instalacja NumPy<\/h2>\n\n\n\n<p>Instalacja NumPy zosta\u0142a szczeg\u00f3\u0142owo wyja\u015bniona <a href=\"#FAQ\" data-type=\"internal\" data-id=\"#FAQ\">w cz\u0119\u015bci FAQ.<\/a> Je\u017celi biblioteka NumPy jest ju\u017c zainstalowana, mo\u017cesz przej\u015b\u0107 do kolejnej cz\u0119\u015bci.<\/p>\n\n\n\n<p>Niewa\u017cne, czy korzystasz z linii polece\u0144, IDE (np. <strong>PyCharm<\/strong>) czy notebooka (np. <strong>Jupyter<\/strong>). Jedyne, co musisz zrobi\u0107, \u017ceby m\u00f3c korzysta\u0107 z NumPy, to napisa\u0107 linijk\u0119 kodu odpowiedzialnego za import biblioteki.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np<\/pre>\n\n\n\n<p>Od teraz mo\u017cesz korzysta\u0107 ze wszystkich mo\u017cliwo\u015bci, jakich dostarcza NumPy. Zach\u0119cam ci\u0119 do samodzielnego uruchomienia fragment\u00f3w kodu, kt\u00f3re zawarte s\u0105 w tym artykule, i modyfikacji wed\u0142ug uznania, \u017ceby lepiej zrozumie\u0107 zasady dzia\u0142ania i mo\u017cliwo\u015bci omawianej biblioteki.<\/p>\n\n\n\n<p>Skupmy si\u0119 najpierw na rzeczach prostych, jakimi s\u0105 np. podstawowe operacje arytmetyczno-logiczne. Do tego niezb\u0119dne jest zrozumienie kluczowej struktury, kt\u00f3r\u0105 wprowadzono w NumPy, czyli <strong>tablicy<\/strong>.<\/p>\n\n\n\n<p>Teraz pewnie zastanawiasz si\u0119, dlaczego w og\u00f3le masz korzysta\u0107 z dodatkowej biblioteki, je\u017celi wszystkie funkcjonalno\u015bci mo\u017cesz napisa\u0107 z u\u017cyciem podstawowych rozwi\u0105za\u0144 w j\u0119zyku Python, jakimi s\u0105 <strong>p\u0119tle <\/strong>(ang. loop) czy <strong>listy <\/strong>(ang. list). W profesjonalnym podej\u015bciu i pracy na ogromnych zbiorach danych (nie tylko numerycznych) cz\u0119sto wa\u017cnym aspektem jest czas. I w tym tkwi w\u0142a\u015bnie przewaga NumPy, czyli w <strong>szybko\u015bci dzia\u0142ania<\/strong>, kt\u00f3ra dodatkowo idzie w parze z <strong>niskim progiem <\/strong>wej\u015bcia dla u\u017cytkownika. W dalszej cz\u0119\u015bci artyku\u0142u przedstawi\u0119 kilka przyk\u0142ad\u00f3w, kt\u00f3re wprowadz\u0105 ci\u0119 w podstawy NumPy. Wykorzystane funkcje poprawiaj\u0105 wydajno\u015b\u0107 w obliczeniach. A mo\u017cna to osi\u0105gn\u0105\u0107 mi\u0119dzy innymi poprzez operacje na wspomnianych wcze\u015bniej tablicach.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Czym-s\u0105-tablice-w-NumPy?\">Czym s\u0105 tablice w NumPy?<\/h2>\n\n\n\n<p><strong>Tablica <\/strong>(ang. <a href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.array.html#numpy-array\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.array.html#numpy-array\" rel=\"noreferrer noopener\">array<\/a>) w NumPy to struktura o jednym wymiarze lub wi\u0119kszej liczbie wymiar\u00f3w pozwalaj\u0105ca na dzia\u0142ania ze zbiorami danych numerycznych, zaczynaj\u0105c od kilkuelementowych po ogromne zbiory przechowywane np. w chmurze. Pami\u0119tajmy, \u017ce nie tylko wymiary charakteryzuj\u0105 tablic\u0119 \u2013 istnieje te\u017c kilka innych, r\u00f3wnie wa\u017cnych cech.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> Tablice s\u0105 sta\u0142ej wielko\u015bci \u2013 nie mo\u017cemy zmieni\u0107 rozmiaru po jej utworzeniu.<\/li>\n\n\n\n<li> Przechowuj\u0105 elementy tego samego typu, np. liczby ca\u0142kowite (ang. <strong>Integer<\/strong>) lub zmiennoprzecinkowe (ang. <strong>float-point<\/strong>).<\/li>\n\n\n\n<li> Wykorzystywane <strong>\u201epod spodem\u201d<\/strong> algorytmy pozwalaj\u0105 na bardzo szybkie operacje i efektywne wykorzystanie pami\u0119ci.<\/li>\n<\/ul>\n\n\n\n<p>Niekt\u00f3rzy por\u00f3wnuj\u0105 tablice do list w Pythonie, ale<a href=\"https:\/\/numpy.org\/doc\/stable\/user\/absolute_beginners.html#whats-the-difference-between-a-python-list-and-a-numpy-array\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/numpy.org\/doc\/stable\/user\/absolute_beginners.html#whats-the-difference-between-a-python-list-and-a-numpy-array\" rel=\"noreferrer noopener\"> listy r\u00f3\u017cni\u0105 si\u0119 od tablic<\/a>, np. mo\u017cliwo\u015bci\u0105 przechowywania element\u00f3w r\u00f3\u017cnego typu (listy mog\u0105 by\u0107 heterogeniczne), a tak\u017ce s\u0105 jednowymiarowe (chocia\u017c mo\u017cliwe jest przechowywanie jednowymiarowej listy w drugiej li\u015bcie). To tyle z teoretycznego wprowadzenia. Poni\u017cej zamie\u015bci\u0142em kilka przyk\u0142ad\u00f3w wraz z obja\u015bnieniami.<\/p>\n\n\n\n<p>W celu stworzenia tablicy mo\u017cesz skorzysta\u0107 z <a href=\"https:\/\/numpy.org\/doc\/stable\/user\/basics.creation.html\" data-type=\"URL\" data-id=\"https:\/\/numpy.org\/doc\/stable\/user\/basics.creation.html\" target=\"_blank\" rel=\"noreferrer noopener\">kilku opcji<\/a>, mi\u0119dzy innymi:<\/p>\n\n\n\n<p><strong>1.<\/strong> <strong>Konwersja listy w tablic\u0119<\/strong>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n# jednowymiarowa tablica na podstawie listy\narr_1d = np.array([1, 2, 3])\n# dwuwymiarowa tablica na podstawie listy\narr_2d = np.array([[1, 2, 3], [4, 5, 6]])<\/pre>\n\n\n\n<p><strong>2. Tablica o sta\u0142ej warto\u015bci.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n# jednowymiarowa tablica wype\u0142niona zerami o d\u0142ugo\u015bci 3\narr_zeros = np.zeros(5)\n# dwuwymiarowa tablica wype\u0142niona jedynkami o wymiarach 3x3\narr_2d_ones = np.ones((3, 3))<\/pre>\n\n\n\n<p><strong>3. Tablica z warto\u015bci losowych.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># jednowymiarowa tablica z losowymi warto\u015bciami z przedzia\u0142u [0,1] o d\u0142ugo\u015bci 3\narr = np.random.rand(3)\n# dwuwymiarowa tablica z losowymi warto\u015bciami z rozk\u0142adu normalnego o wymiarach 3x3\narr_2d = np.random.randn(3, 3)<\/pre>\n\n\n\n<p><strong>4. Tablica na podstawie pliku wej\u015bciowego.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n# inicjalizacja tablicy za pomoc\u0105 pliku wej\u015bciowego\narr_file = np.loadtxt('file_name.txt')<\/pre>\n\n\n\n<p>Jak widzisz, lista opcji stworzenia tablicy nie ogranicza si\u0119 do jednej czy dw\u00f3ch, a powy\u017csze przyk\u0142ady jej nie wyczerpuj\u0105. Poniewa\u017c wiesz ju\u017c czym s\u0105 tablice i jak je stworzy\u0107, mo\u017cemy przej\u015b\u0107 do om\u00f3wienia operacji z wykorzystaniem tablic numerycznych, kt\u00f3re u\u0142atwi\u0105 obliczenia na du\u017cych zbiorach danych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">NumPy \u2013 podstawowe operacje<\/h3>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n# tworzenie jednowymiarych tablic a i b\na = np.array([1, 2, 3])\nb = np.array([4, 5, 6])\n# dodawanie tablicy b do tablicy a\nc = a + b\n# mno\u017cenie tablicy a przez sta\u0142\u0105 2\nd = 2 * a<\/pre>\n\n\n\n<p>Wynikiem operacji logicznych takich jak AND (koniunkcja), OR (alternatywa) czy NOT (negacja) jest tablica zawieraj\u0105ca warto\u015bci logiczne True i False.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n# tworzenie jednowymiarych tablic a i b\na = np.array([1, 2, 3])\nb = np.array([3, 2, 1])\n# sprawdzamy, kt\u00f3re elementy w tablicy a s\u0105 mniejsze od odpowiadaj\u0105cych im element\u00f3w w tablicy b\nc = a &lt; b\n# sprawdzamy kt\u00f3re elementy w tablicy a s\u0105 r\u00f3wne 2 lub 3\nd = (a == 2) | (a == 3)<\/pre>\n\n\n\n<p>Wynikiem operacji redukcyjnych takich jak suma, minimum, maksimum czy \u015brednia jest skalar.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n# tworzenie jednowymiarowej tablicy a\na = np.array([1, 2, 3])\n# suma element\u00f3w tablicy a\nb = np.sum(a)\n# \u015brednia arytmetyczna dla element\u00f3w tablicy a\nc = np.mean(a)\n# najwi\u0119kszy element w tablicy a\nd = np.max(a)<\/pre>\n\n\n\n<p>Dobrym przyk\u0142adem jest tak\u017ce mno\u017cenie macierzy i obliczenie wyznacznika, a tak\u017ce rozwi\u0105zanie uk\u0142adu r\u00f3wna\u0144 liniowych.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n# tworzenie macierzy a i b\na = np.array([[1, 2], [3, 4]])\nb = np.array([[5, 6], [7, 8]])\n# operacja mno\u017cenia macierzy a i b\nc = np.dot(a, b)\n# obliczenie wyznacznika macierzy a\nd = np.linalg.det(a)\n# wyznaczenie rozwi\u0105zania uk\u0142adu r\u00f3wna\u0144 liniowych Ax = b\nA = np.array([[1, 2], [3, 4]])\nb = np.array([5, 6])\nx = np.linalg.solve(A, b)<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"R\u00f3\u017cnica-mi\u0119dzy-ndarray-a-array\">R\u00f3\u017cnica mi\u0119dzy ndarray a array<\/h2>\n\n\n\n<p>Je\u017celi zag\u0142\u0119bi\u0142e\u015b si\u0119 chocia\u017c troch\u0119 bardziej w tematyk\u0119 tablic w bibliotece NumPy, to mo\u017cliwe, \u017ce spotka\u0142e\u015b si\u0119 z <strong>numpy.ndarray() <\/strong>oraz <strong>numpy.array()<\/strong>. Prawdopodobnie zastanawiasz si\u0119, jaka jest r\u00f3\u017cnica pomi\u0119dzy nimi \u2013 dlatego proponuj\u0119 kr\u00f3tkie wyja\u015bnienie. Na wst\u0119pie zaznacz\u0119, \u017ce podstawowa wiedza z programowania obiektowego lub poj\u0119cia typu klasa i obiekt powinny by\u0107 ci znane w celu poprawnego zrozumienia r\u00f3\u017cnicy pomi\u0119dzy ndarray a array. <\/p>\n\n\n\n<p>Zgodnie <a href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.ndarray.html\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.ndarray.html\" rel=\"noreferrer noopener\">z dokumentacj\u0105<\/a> i koncepcj\u0105 <a href=\"https:\/\/docs.python.org\/3\/reference\/datamodel.html\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/docs.python.org\/3\/reference\/datamodel.html\" rel=\"noreferrer noopener\">j\u0119zyka Python<\/a> <strong>numpy.ndarray()<\/strong> jest klas\u0105, a <strong>numpy.array()<\/strong> jest metod\u0105\/funkcj\u0105, za pomoc\u0105 kt\u00f3rej tworzymy obiekt ndarray, czyli w\u0142a\u015bnie tablic\u0119. Wcze\u015bniej om\u00f3wili\u015bmy, w jaki spos\u00f3b mo\u017cesz stworzy\u0107 tablic\u0119 w NumPy. Zgodnie <a href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.ndarray.html\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.ndarray.html\" rel=\"noreferrer noopener\">z dokumentacj\u0105 NumPy<\/a> mo\u017cliwe jest tworzenie tablicy bezpo\u015brednio za pomoc\u0105 <strong>numpy.ndarray()<\/strong>, ale zalecanym podej\u015bciem jest korzystanie<a href=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.empty.html\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/numpy.org\/doc\/stable\/reference\/generated\/numpy.empty.html\" rel=\"noreferrer noopener\"> z funkcji wbudowanych<\/a>, np. <strong>numpy.array()<\/strong>, <strong>numpy.zeros()<\/strong> lub <strong>numpy.empty()<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Funkcje-wbudowane\">Funkcje wbudowane<\/h2>\n\n\n\n<p>Za definicj\u0105 funkcji wbudowanej w NumPy nie stoi nic skomplikowanego. To po prostu funkcja, kt\u00f3ra zosta\u0142a dostarczona przez bibliotek\u0119. Oznacza to, \u017ce mo\u017cesz wywo\u0142a\u0107 tak\u0105 funkcj\u0119 bez potrzeby importowania dodatkowych modu\u0142\u00f3w np. poza bibliotek\u0105 NumPy. Funkcje wbudowane to najcz\u0119\u015bciej zbi\u00f3r podstawowych funkcjonalno\u015bci gotowych do wykorzystania po przekazaniu.<\/p>\n\n\n\n<p>odpowiednich parametr\u00f3w (je\u017celi s\u0105 wymagane). W przypadku NumPy jest to zbi\u00f3r funkcji umo\u017cliwiaj\u0105cych dzia\u0142ania na tablicach, macierzach czy wektorach. Je\u017celi chcesz w pe\u0142ni wykorzysta\u0107 potencja\u0142 biblioteki NumPy, korzystanie z funkcji wbudowanych jest niezb\u0119dne. W celu zapoznania si\u0119 z pe\u0142n\u0105 list\u0105 funkcji wbudowanych odsy\u0142am ci\u0119 <a href=\"https:\/\/numpy.org\/doc\/stable\/reference\/routines.math.html\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/numpy.org\/doc\/stable\/reference\/routines.math.html\" rel=\"noreferrer noopener\">do dokumentacji NumPy<\/a>, a poni\u017cej zamieszczam kilka wybranych przyk\u0142ad\u00f3w.<\/p>\n\n\n\n<p><strong>1. Utworzenie tablicy z r\u00f3wno roz\u0142o\u017conymi elementami w wybranym zakresie.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n# tablica z 10 r\u00f3wno roz\u0142o\u017conymi warto\u015bciami w zakresie od 0 do 2\na = np.linspace(0, 2, 10)<\/pre>\n\n\n\n<p><strong>2. Utworzenie macierzy i jej transpozycja.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n# tworzenie macierzy 3x3\nx = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n# transpozycja macierzy a do macierzy b\nb = np.transpose(a)<\/pre>\n\n\n\n<p><strong>3. Sortowanie tablicy.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n# tworzenie tablicy z 10 elementami\na = np.array([3, 7, 3, 3, 2, 9, 7, 1, 5, 4])\n# sortowanie tablicy\nb = np.sort(a) <\/pre>\n\n\n\n<p><strong>4. Obliczenie transformaty Fouriera dla wybranej tablicy.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n# tworzenie tablicy z 6 elementami\na = np.array([1, 2, 3, 4, 5, 6])\n# obliczanie transformaty Fouriera\nb = np.fft.fft(a<\/pre>\n\n\n\n<p><strong>5. Wygenerowanie pi\u0119ciu losowych warto\u015bci z rozk\u0142adu normalnego.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\n# ustalenie ziarna dla generatora liczb losowych\nnp.random.seed(12345)\n# wygenerowanie pi\u0119ciu losowych warto\u015bci z rozk\u0142adu normalnego\na = np.random.randn(5)<\/pre>\n\n\n\n<p>Powy\u017cej zamie\u015bci\u0142em kilka przyk\u0142ad\u00f3w, zaczynaj\u0105c od tych o niskiej z\u0142o\u017cono\u015bci, ale niekt\u00f3re z nich mog\u0105 wymaga\u0107 znajomo\u015bci bardziej zaawansowanych poj\u0119\u0107 z obszar\u00f3w<a href=\"https:\/\/pythonnumericalmethods.berkeley.edu\/notebooks\/chapter24.02-Discrete-Fourier-Transform.html\" target=\"_blank\" data-type=\"URL\" data-id=\"https:\/\/pythonnumericalmethods.berkeley.edu\/notebooks\/chapter24.02-Discrete-Fourier-Transform.html\" rel=\"noreferrer noopener\"> matematyki, statystyki czy fizyki.<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Por\u00f3wnanie-czasu-wykonania-funkcji-w-NumPy-i-bez-u\u017cycia-tej-biblioteki\">Por\u00f3wnanie czasu wykonania funkcji w NumPy i bez u\u017cycia tej biblioteki<\/h2>\n\n\n\n<p>Zanim om\u00f3wi\u0119 korzy\u015bci i potencjalne trudno\u015bci wynikaj\u0105ce z wykorzystania NumPy w twoim projekcie, chcia\u0142em pokaza\u0107 ci r\u00f3\u017cnice w czasie wykonania funkcji napisanej w j\u0119zyku Python bez dodatkowych bibliotek i tej z u\u017cyciem biblioteki NumPy. U\u017cyjemy do tego dw\u00f3ch przyk\u0142ad\u00f3w. Pierwszy mierzy czas potrzebny na sumowanie losowych element\u00f3w z listy, a drugi pokazuje czas obliczania iloczynu skalarnego dw\u00f3ch wektor\u00f3w. Zwr\u00f3\u0107 uwag\u0119 na to, \u017ce czas wykonania mo\u017ce si\u0119 r\u00f3\u017cni\u0107 w zale\u017cno\u015bci od zasob\u00f3w maszyny, na kt\u00f3rej uruchamiasz kod.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Przyk\u0142ad 1:<\/h3>\n\n\n\n<p>Pierwsza funkcja korzysta z <strong>numpy.sum()<\/strong>, a druga sumuje elementy z u\u017cyciem p\u0119tli <strong>for<\/strong>.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"> import numpy as np\nimport time\n# implementacja z u\u017cyciem NumPy\ndef numpy_sum(a):\nreturn np.sum(a)\n# implementacja bez dodatkowych bibliotek\ndef python_sum(a):\nsum = 0\nfor i in a:\nsum += i\nreturn sum\n# tworzenie listy z losowymi liczbami\na = np.random.randint(0, 100, 5000000)\n# czas wykonania funkcji z NumPy\nstart_time = time.time()\nnumpy_sum(a)\nprint(\"Czas wykonania funkcji z NumPy: %.6f sekund\" % (time.time() - start_time))\n# czas wykonania funkcji bez dodatkowych bibliotek\nstart_time = time.time()\npython_sum(a)\nprint(\"Czas wykonania funkcji bez NumPy: %.6f sekund\" % (time.time() - start_time))<\/pre>\n\n\n<div class=\"special-content-box style-1\">\r\n    <div class=\"box\">\r\n                <div class=\"content\">\r\n            <ul>\n<li>Czas wykonania funkcji z NumPy: 0.001995 sekund<\/li>\n<li>Czas wykonania funkcji bez NumPy: 0.242352 sekund<\/li>\n<\/ul>\n                    <\/div>\r\n    <\/div>\r\n<\/div>\r\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Przyk\u0142ad 2:<\/h3>\n\n\n\n<p>Pierwsza funkcja korzysta z <strong>numpy.dot()<\/strong>, a druga korzysta z p\u0119tli <strong>for.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">import numpy as np\nimport time\n# implementacja z u\u017cyciem NumPy\ndef numpy_dot(a, b):\nreturn np.dot(a, b)\n# implementacja bez dodatkowych bibliotek\ndef python_dot(a, b):\ndot = 0\nfor i in range(len(a)):\ndot += a[i] * b[i]\nreturn dot\n# tworzenie dw\u00f3ch wektor\u00f3w z losowymi liczbami\na = np.random.randint(0, 100, 700000)\nb = np.random.randint(0, 100, 700000)\n# czas wykonania funkcji z NumPy\nstart_time = time.time()\nnumpy_dot(a, b)\nprint(\"Czas wykonania funkcji z NumPy: %.6f sekund\" % (time.time() - start_time))\n# czas wykonania funkcji bez dodatkowych bibliotek\nstart_time = time.time()\npython_dot(a, b)\nprint(\"Czas wykonania funkcji bez NumPy: %.6f sekund\" % (time.time() - start_time))<\/pre>\n\n\n<div class=\"special-content-box style-1\">\r\n    <div class=\"box\">\r\n                <div class=\"content\">\r\n            <ul>\n<li>Czas wykonania funkcji z NumPy: 0.000000 sekund<\/li>\n<li>Czas wykonania funkcji bez NumPy: 0.117685 sekund<\/li>\n<\/ul>\n                    <\/div>\r\n    <\/div>\r\n<\/div>\r\n\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Jak mo\u017cna zauwa\u017cy\u0107, funkcja z wykorzystaniem NumPy jest wyra\u017anie szybsza od implementacji z u\u017cyciem p\u0119tli for.<\/strong><\/p>\n\n\n\n<p>Bior\u0105c pod uwag\u0119, \u017ce zazwyczaj pracuje si\u0119 na du\u017cych zbiorach danych, ta r\u00f3\u017cnica mo\u017ce by\u0107 jeszcze wi\u0119ksza.<\/p>\n\n\n\n<p><strong>Przeczytaj r\u00f3wnie\u017c:<\/strong> <a href=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/wprowadzenie-do-swiata-azure-iot\/\" data-type=\"link\" data-id=\"https:\/\/nearshore-it.eu\/pl\/artykuly\/wprowadzenie-do-swiata-azure-iot\/\">Wprowadzenie do \u015bwiata Azure IoT<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zalety i wady korzystania z NumPy<\/h2>\n\n\n\n<p>Wykorzystanie NumPy w projekcie wi\u0105\u017ce si\u0119 z wieloma korzy\u015bciami i u\u0142atwieniami, poni\u017cej zebra\u0142em najwa\u017cniejsze z nich.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Zalety NumPy<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Szybko\u015b\u0107 <\/strong>\u2013 g\u0142\u00f3wn\u0105 zalet\u0105 NumPy jest szybko\u015b\u0107, poniewa\u017c rozwi\u0105zania w tej bibliotece bazuj\u0105 na niskopoziomowym j\u0119zyku C. Obliczenia s\u0105 zoptymalizowane i pozwalaj\u0105 na wykonywanie operacji w spos\u00f3b wektorowy, co w znacz\u0105cy spos\u00f3b przek\u0142ada si\u0119 na wzrost wydajno\u015bci.<\/li>\n\n\n\n<li><strong>Pr\u00f3g wej\u015bcia <\/strong>\u2013 NumPy ma niski pr\u00f3g wej\u015bcia dla os\u00f3b, kt\u00f3re na co dzie\u0144 nie maj\u0105 do czynienia z programowaniem. Umo\u017cliwia \u0142atwe tworzenie lub modyfikacj\u0119 istniej\u0105cych rozwi\u0105za\u0144, kt\u00f3re u\u017cywane s\u0105 w przetwarzaniu du\u017cych zbior\u00f3w danych, w tym przypadku numerycznych.<\/li>\n\n\n\n<li><strong>Zakres operacji <\/strong>\u2013 jak om\u00f3wiono w przyk\u0142adach, NumPy posiada szeroki zakres operacji numerycznych. Umo\u017cliwia wykonanie prostych dzia\u0142a\u0144 arytmetyczno-logicznych, ale te\u017c zada\u0144 sortowania czy operacji statystycznych. Dodatkowo dzia\u0142a niezale\u017cnie od platformy czy systemu operacyjnego. Je\u017celi mo\u017cesz korzysta\u0107 z Pythona, pewnie skorzystasz r\u00f3wnie\u017c z NumPy.<\/li>\n\n\n\n<li><strong>Integracja z innymi bibliotekami<\/strong> \u2013 NumPy dobrze wsp\u00f3\u0142pracuje z innymi bibliotekami, kt\u00f3re u\u017cywane s\u0105 w analizie i pracy z du\u017cymi zbiorami danych. Przyk\u0142adem mo\u017ce by\u0107 integracja z Pandas, Matplotlib lub SciPy.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Wady NumPy<\/h3>\n\n\n\n<p>Nale\u017cy te\u017c pami\u0119ta\u0107 o potencjalnych utrudnieniach, kt\u00f3re mog\u0105 wynika\u0107 z u\u017cywania biblioteki NumPy nie do ko\u0144ca zgodnie z jej przeznaczeniem.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Wykorzystanie pami\u0119ci <\/strong>\u2013 biblioteka ta wykorzystana w niew\u0142a\u015bciwy spos\u00f3b mo\u017ce u\u017cywa\u0107 sporo pami\u0119ci, a to z kolei \u2013 wp\u0142yn\u0105\u0107 na wydajno\u015b\u0107 w przetwarzaniu ogromnych zbior\u00f3w danych. Wa\u017cne jest w\u0142a\u015bciwe zrozumienie sk\u0142adni i znajomo\u015b\u0107 poj\u0119\u0107 matematycznych, kt\u00f3re stoj\u0105 za funkcjami dostarczanymi przez bibliotek\u0119.<\/li>\n\n\n\n<li><strong>Ograniczone wykorzystanie <\/strong>\u2013 NumPy nie wspiera tablic o zmiennej d\u0142ugo\u015bci, dlatego nie nadaje si\u0119 do pracy na przyk\u0142ad z danymi tekstowymi. Istniej\u0105 inne biblioteki, kt\u00f3re w tym przypadku poradz\u0105 sobie lepiej.<\/li>\n\n\n\n<li><strong>Indeksowanie mo\u017ce by\u0107 skomplikowane <\/strong>\u2013 to temat na odr\u0119bny artyku\u0142, ale nale\u017cy wspomnie\u0107, \u017ce NumPy pozwala na zaawansowane indeksowanie tablic, kt\u00f3re poprawia wydajno\u015b\u0107 programu. Wymaga to jednak praktyki i bardzo dobrego zrozumienia zar\u00f3wno samej biblioteki, jak i przetwarzanego zbioru danych.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Podsumowanie\">Podsumowanie<\/h2>\n\n\n\n<p>Mam nadziej\u0119, \u017ce uda\u0142o mi si\u0119 przedstawi\u0107 podstawowe zagadnienia zwi\u0105zane z przetwarzaniem danych numerycznych za pomoc\u0105 biblioteki NumPy i pokaza\u0107 jej potencjalne mo\u017cliwo\u015bci. Implementacja w realnych projektach pozwoli w pe\u0142ni pokaza\u0107 jej potencja\u0142 i korzy\u015bci wynikaj\u0105ce z u\u017cycia funkcji, kt\u00f3rych dostarcza. Szybko\u015b\u0107, integracja z innymi bibliotekami i \u0142atwo\u015b\u0107 u\u017cycia zdecydowanie zach\u0119caj\u0105 do zapoznania si\u0119 z jej mo\u017cliwo\u015bciami. Oczywi\u015bcie, jak w ka\u017cdym przypadku, sprawne korzystanie z tej biblioteki przychodzi z czasem, ale ju\u017c od pierwszych godzin mo\u017ce przynie\u015b\u0107 zadowalaj\u0105ce efekty.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"FAQ\">FAQ  <\/h3>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1682422703483\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><strong>Jak zainstalowa\u0107 NumPy?<\/strong><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>W celu instalacji biblioteki NumPy zach\u0119cam do przej\u015bcia prostego tutoriala zawartego na stronie biblioteki: <a href=\"https:\/\/numpy.org\/doc\/stable\/user\/absolute_beginners.html\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/numpy.org\/doc\/stable\/user\/absolute_beginners.html <\/a>Je\u017celi masz ju\u017c zainstalowany Python, mo\u017cesz skorzysta\u0107 z <a href=\"https:\/\/pypi.org\/project\/numpy\/\" target=\"_blank\" rel=\"noreferrer noopener\">jednej z komend<\/a>:<br \/><strong>pip install numpy<\/strong>, lub<strong> conda install numpy<\/strong>.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n<div style=\"height:32px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Je\u017celi poj\u0119cie biblioteki Python nie jest ci znane, w tym artykule wyja\u015bni\u0119, czym jest biblioteka w j\u0119zyku Python, oraz om\u00f3wi\u0119 mo\u017cliwo\u015bci biblioteki NumPy, kt\u00f3ra w moim przekonaniu jest jedn\u0105 z ciekawszych propozycji na start.<\/p>\n","protected":false},"author":137,"featured_media":29177,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"iawp_total_views":2108,"footnotes":""},"categories":[1,582],"tags":[602],"offering":[522],"class_list":["post-29176","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artykuly","category-technologie","tag-python-2","offering-tech-blog"],"acf":[],"_links":{"self":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29176","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/users\/137"}],"replies":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/comments?post=29176"}],"version-history":[{"count":8,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29176\/revisions"}],"predecessor-version":[{"id":33683,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/posts\/29176\/revisions\/33683"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media\/29177"}],"wp:attachment":[{"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/media?parent=29176"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/categories?post=29176"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/tags?post=29176"},{"taxonomy":"offering","embeddable":true,"href":"https:\/\/nearshore-it.eu\/pl\/wp-json\/wp\/v2\/offering?post=29176"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}