Sunday, June 18, 2023

Otkrijte moć NumPy-a, uvod u Python biblioteku za manipulaciju nizovima

NumPy je biblioteka za programski jezik Python koja pruža podršku za efikasno manipulisanje višedimenzionalnim nizovima i matricama. Ta biblioteka je samo jedna od osnovnih alata za naučno računanje u Python programskom jeziku i često se koristi u oblastima kao što su analiza podataka, mašinsko učenje, obrada signala, vizuelizacija i mnoge druge delatnosti. Svoju popularnost je najviše stekla kroz današnji brzi razvoj AI - veštačke inteligencije. Inače, biblioteka je nastala kao proširenje na Python programskom jeziku, na kom je prvo radio softver programer Jim Hugunin koji je napustio Microsoft korporaciju i prešao da radi za Google korporaciju. Ali ono što NumPy biblioteku čini danas, jeste uglavnom delo Travis Oliphant-a, koji se smatra primarnim kreatorom NumPz-a, osnivačem startup-a Anaconda i osnivačem SciPy paketa u Python programskom jeziku. Ova open-source biblioteka je postala prvo značajna zato što rešava sporost Python interpretacije. NumPy biblioteka rešava ovaj problem pružajući višedimenzionalne matrice, funkcije i operatore koji rade efikasno sa nizovima. Kada koristite biblioteku NumPy, to znači da kod pišete sa manjim brojem unutrašnjih petlji. Na taj način, svaki algoritam koji se može izraziti kao operacija nad nizovima i matricama, može raditi gotovo jednako brzo kao ekvivalentni C kôd.


( Python NumPy biblioteka, rešenje za efikasno manipulisanje nizovima i matricama )

Korišćenje i funkcionalnost NumPy biblioteke, programeri često porede sa MATLAB okruženjem jer oba interpretiraju kod i omogućavaju korisnicima da brzo pišu proračune dok se većina operacija izvršava na nizovima i matricama umesto na skalarnim vrednostima. U poređenju sa MATLAB-om, koji je nastao još 1970 godineNumPy je integrisan u Python, moderan, potpun i programski jezik izvornog kodiranja. Međutim, oba jezika se oslanjaju na BLAS i LAPACK za efikasna linearna algebarska izračunavanja. Glavni element u NumPy-u je ndarray – n dimenzionalni niz, koji predstavlja višedimenzionalni homogeni niz elemenata istog tipa podataka. NumPy pruža efikasne operacije nad ovim nizovima, uključujući matematičke, logičke, statističke i linearno algebarske operacije. Takođe, NumPy ima veliki broj ugrađenih funkcija za rad sa nizovima i mogućnost za jednostavno čitanje i pisanje podataka u različitim formatima. U teoriji ovo može zvučati komplikovano, ali u praksi korišćenje NumPy biblioteke je jednostavno iako je ključno za numeričko računanje u Python programskom jeziku. Python programski jezik nije prvobitno namenjen za numeričko računarstvo, ali je privukao pažnju naučne i inženjerske zajednice. Kao rezultat toga, još 1995 godine je osnovana posebno interesantna grupa pod nazivom "Matrix-SIG" sa ciljem definisanja skupa računarskih paketa za numeričko računanje. Zahvaljujući NumPy-uPython je postao moćan jezik za numeričko računanje, analizu podataka, mašinsko učenje i druge oblasti naučnog istraživanja. Što se tiče ograničenja NumPy biblioteke, ona je dizajnirana za rad sa homogenim podacima, zahteva da nizovi budu prethodno definisane veličine, operacije nad nizovima zahtevaju dodatnu memoriju, nema podršku za paralelizaciju izvan kutije i ima ograničenu podršku za ne numeričke operacije. Iako ova ograničenja postoje, NumPy i dalje pruža izuzetnu vrednost i efikasnost u numeričkom računanju. Mnoga od ovih ograničenja mogu se prevazići korišćenjem drugih biblioteka ili prilagođavanjem koda prema specifičnim potrebama. Pre nego što počnemo sa praktičnim delom ovog tutorijala, u slučaju da se niste pripremili za kodiranje; pogledajte prethodni post.

Praktični primeri i kodiranje korišćenjem NumPy biblioteke

Pokrenite Anaconda navigator i zatim lansirajte Jupyter Notebook. Kad vam se otvori pretraživač sa stranicom Jupyter tree; potražite direktorijum Document, zatim AI_tutorial i kreirajte novi dokument i nazovite ga lesson2.ipynb. Na navigatoru otvorite combobox i odaberite stavku Markdown. Zatim otkucajte sledeći naslov.

The Simple Basic Python NumPy Tutorial

Kliknite na dugme + na navigatoru. Prva stvar koju treba da uradite kada hoćete da koristite biblioteku NumPy jeste da je uvezete u vaš dokument i da joj napravite neki kraći alias. Praksa je da to bude np

# import numpy and make the alias

import numpy as np

Ukucajte jedan običan NumPy niz.

np.array([1,2,3])

Zatim pritisnite CTRL + Enter. Ukoliko dobijete sledeći rezultat.

array([1, 2, 3])

To znači da sve radi odlično. Ukoliko ne, obratite pažnju na grešku; možda nemate instaliran NumPy.
Ukoliko je to problem NumPy možete instalirati ili kroz terminal ili direktno kroz Jupyter ćeliju.

! pip install numpy

Ako je sve u redu, možete početi sa tutorijalom. Prvo napravite jedan jednostavan niz i prikažite ga kroz promenjivu. 

# simple array

a = np.array([[1,2,3],[4,5,6]])

print(a)

Rezultat:

[[1 2 3]

[4 5 6]]

Za razliku od niza, matrix je uvek 2D - dvodimenzionalan i nikad nije jednodimenzionalan. Napravite jedan jednostavan matrix

# simple matrix

b = np.mat([[1,2,3],[4,5,6],[7,8,9]])

print(b)

Rezultat:

[[1 2 3]

[4 5 6]

[7 8 9]]

Kako možete videti koliko dimenzija ima neki NumPy niz. Kucajte sledeće.

# get dimensions

a.ndim

Rezultat:

2

Ponekad nećete znati kakvog je oblika neki NumPy niz. Postoji funkcija i za to rešenje.

# get shape

a.shape

Rezultat:

(2, 3)

Prema defaultu kada koristite celobrojne brojeve u NumPy nizovima, oni su tip podataka int32.

# get type

a.dtype

Rezultat:

dtype('int32')

Međutim, vi možete da promenite tip podataka u NumPy nizu kako vama odgovara.

# specify type int32 into int16

c = np.array([[1,2,3],[4,5,6]], dtype='int16')

c.dtype

Rezultat:

dtype('int16')

Pogledajte sada kako da vidite kolika je veličina u bajtima samo jednog elementa u NumPy nizu.

# get length of one array element in bytes

a.itemsize

Rezultat:

4

Ako pogledate niz a koji smo kreirali, videćete da taj niz ima 6 elemenata. Kako to možete proveriti?

# get number of elements

a.size

Rezultat:

6

Kako možete znati koliko svi elementi u NumPy nizu uzimaju bajta? Pogledajte sledeću funkciju.

# get total bytes consumed by the elements of the array

a.nbytes

Rezultat:

24

Vratimo se malo osnovama. Kako možete videti vrednost određenog elementa u NumPy nizu? Probajte ovako nešto.

# get a specific element

a[1,1]

Rezultat:

5

Da li ovo isto možemo dobiti koristeći negaciju? Naravno, 2 niz i sa desne strane 2 elemenat.

# get a specific element using negative number

a[1,-2]

Rezultat:

5

Šta ako hoćete da vidite samo određeni red u nekom NumPy nizu? Pokušajte, na sledeći način.

# get a specific row

a[0, :]

Rezultat:

array([1, 2, 3])

Ili vam možda više treba određena kolona?

# get a specific column

a[:, 1]

Rezultat:

array([2, 5])

Kako da vidite određene elemente NumPy niza određujući početnu i zadnju poziciju niza ali i određenog intervala? Pogledajte sledeći primer.

# get some data from an array using startindex, endindex and stepsize

d = np.array([[1,2,3,4,5,6,7,8], [9,10,11,12,13,14,15,16]])

d[0, 1:8:2]

Rezultat:

array([2, 4, 6, 8])

Prikazivanje određeni elemenata u NumPy nizu je korisno ali dobro pitanje je i kako se menja neki elemenat?

# get change an element in the array

d[1,4] = 23

print(d)

Rezultat:

[[ 1 2 3 4 5 6 7 8]

[ 9 10 11 12 23 14 15 16]]

Kako da napravimo neki NumPy niz i ispunimo ga nulama? Pogledajte sledeći primer.

# get all 0s

np.zeros((2,8))

Rezultat:

array([[0., 0., 0., 0., 0., 0., 0., 0.],

[0., 0., 0., 0., 0., 0., 0., 0.]])

Ovo postaje interesantno. Kako ovo isto da uradimo sa jedinicama, ali da mi odredimo tip podataka.

# get all 1s to be int64

np.ones((2,8), dtype='int64')

Rezultat:

array([[1, 1, 1, 1, 1, 1, 1, 1],

[1, 1, 1, 1, 1, 1, 1, 1]], dtype=int64)

Sjajno, ali šta ako mi hoćemo da odredimo broj sa kojim će biti ispunjen NumPy niz? Pogledajte rešenje na primer za broj 88.

# get all any number

np.full((2,8), 88)

Rezultat:

array([[88, 88, 88, 88, 88, 88, 88, 88],

[88, 88, 88, 88, 88, 88, 88, 88]])

Šta ako hoćete da promenite vrednost svih elemenata već kreiranog nekog NumPy niza nekim brojem? Možda je sledeća funkcija prikladnija za taj zadatak.

# get all any number full-like

e = np.array([[1,2,3],[4,5,6],[7,8,9]])

np.full_like(e, 8)

Rezultat:

array([[8, 8, 8],

[8, 8, 8],

[8, 8, 8]])

Biranje slučajnih brojeva je jedna od česti stvari koje se koriste u igricama, ali se može koristiti i u  AI - veštačkoj inteligenciji kada hoćete na primer da robot uradi nešto spontano. Pogledajte prvo kako se puni neki NumPy niz biranjem slučajnih brojeva u decimalnom obliku.

# random decimal numbers

np.random.rand(4,3)

Rezultat:

array([[0.04871196, 0.35117614, 0.20647421],

       [0.62571628, 0.96698987, 0.18247642],

       [0.01029132, 0.56817888, 0.08467444],

       [0.01443212, 0.78087052, 0.26281676]])

Kako da birate slučajne brojeve tipa integer u rasponu od 0 do 8 i onda njih smestite u NumPy niz? Onda treba da uradite sledeće.

# random integer numbers

np.random.randint(9, size=(4,3))

Rezultat:

array([[7, 3, 5],

       [4, 5, 4],

       [1, 5, 1],

       [2, 4, 1]])

Možemo li da pređemo na nešto komplikovanije? Kako da napravite NumPy niz ispunjen nulama i jedinicama u obliku kvadrata sa dijagonalom? Ovaj komplikovan zadatak se rešava jednom linijom koda.

# the identity array is a square array with ones on the main diagonal

np.identity(8)

Rezultat:

array([[1., 0., 0., 0., 0., 0., 0., 0.],

       [0., 1., 0., 0., 0., 0., 0., 0.],

       [0., 0., 1., 0., 0., 0., 0., 0.],

       [0., 0., 0., 1., 0., 0., 0., 0.],

       [0., 0., 0., 0., 1., 0., 0., 0.],

       [0., 0., 0., 0., 0., 1., 0., 0.],

       [0., 0., 0., 0., 0., 0., 1., 0.],

       [0., 0., 0., 0., 0., 0., 0., 1.]])

Šta ako imate napravljen neki NumPy niz, ali hoćete da se on ponavlja više puta u drugom nizu? I u ovom slučaju imate jednostavno rešenje.

# repaeat an array

f = np.array([[1,2,3,4]])

g = np.repeat(f,4, axis=0)

print(g)

Rezultat:

[[1 2 3 4]

[1 2 3 4]

[1 2 3 4]

[1 2 3 4]]

Međutim, šta je sa kopiranjem NumPy nizova? Kad je to u pitanju trebate obratiti pažnju da li kopirate niz kao referencu ili kao vrednost? 

# coping arrays

h = np.array([1,2,3,4,5])

i = h

j = h.copy()

print(i)

i[3] = 10 # change an element in i will change the element in h, too!

print(h)

print(j)

j[4] = 11 # it will not change the element in h, because use copy()

print(h)

Rezultat:

[1 2 3 4 5]

[1 2 3 10 5]

[1 2 3 4 5]

[1 2 3 10 5]

[1 2 3 4 11]

Za razliku od Python nizova, koristeći biblioteku NumPyvi možete vršiti jednostavno sve aritmetičke operacije nad NumPy nizovima. I to na dva načina.  

# the arthimetic operations

k = np.array([5,6,7,8])

l = np.array([1,2,3,4])


m1 = k + l

print(m1)

m2 = np.add(k,l)

print(m2)

 

m1 = k - l

print(m1)

m2 = np.subtract(k,l)

print(m2)

 

m1 = k * l

print(m1)

m2 = np.multiply(k,l)

print(m2)

 

m1 = k / l

print(m1)

m2 = np.divide(k,l)

print(m2)

 

m1 = k ** l

print(m1)

m2 = np.power(k,l)

print(m2)

 

m1 = k % l

print(m1)

m2 = np.mod(k,l)

print(m2)


Rezultat:

[4 4 4 4]

[4 4 4 4]

[ 5 12 21 32]

[ 5 12 21 32]

[5. 3. 2.33333333 2. ]

[5. 3. 2.33333333 2. ]

[ 5 36 343 4096]

[ 5 36 343 4096]

[0 0 1 0]

[0 0 1 0]

Što se tiče trigonometrijski funkcija, biblioteka NumPy ima mnoštvo funkcija koje trebate pogledati na zvaničnom sajtu ove biblioteke ovde. Pogledajte najosnovnija tri primera gde koristimo sinus, kosinus i tangens.

# Trigonometric functions

n = np.array([1,2,3])


o1 = np.sin(n)

print(o1)

 

o2 = np.cos(n)

print(o2)

 

o3 = np.tan(n)

print(o3)


# etc.

Rezultat:

[0.84147098 0.90929743 0.14112001]

[ 0.54030231 -0.41614684 -0.9899925]

[ 1.55740772 -2.18503986 -0.14254654]

Vratimo se opet na neke osnovnije stvari. Na primer kako da reorganizujemo neki NumPy niz da ima sasvim drugačije dimenzije i to sa svim elementima prvog niza? Da, da ne poverujete.

# Reorganizing arrays

p = np.array([[1,2,3,4,5],[1,2,3,4,5]])

print(f)

r = p.reshape((5,2))

print(r)

Rezultat:

[[1 2 3 4 5]

 [1 2 3 4 5]]

[[1 2]

 [3 4]

 [5 1]

 [2 3]

 [4 5]]

Pogledajte na primer kako da slažete vertikalno NumPy nizove.

# Verticaly stacking vectors

s1 = np.array([1,2,3])

s2 = np.array([4,5,6])

np.vstack([s1,s2,s2,s1])

Rezultat:

array([[1, 2, 3],

       [4, 5, 6],

       [4, 5, 6],

       [1, 2, 3]])

I za kraj pogledajte na primer kako da slažete horizontalno NumPy nizove.

# Horisontaly stacking vectors

np.hstack((s1,s2))

Rezultat:

array([1, 2, 3, 4, 5, 6])

Ovo su bili najosnovniji primeri kako se koristi biblioteka NumPy. Sa ovom bibliotekom možete činiti mnogo više i po pitanju algebre. Za to vam je potrebno mnogo više truda i vremena. Zato uvek imajte na umu zvaničnu prezentaciju NumPy biblioteke. Možete je pogledati ovde. Kako svi ovi navedeni primeri izgledaju, možete pogledati i na video-u:



( AI – 3. The Simple Basic Python NumPy Tutorial )

 

 

 

 

               




 

 

 

No comments:

Post a Comment