Numpy
numpy
je paket (modul) za (efikasno) numeričko računanje u Pythonu. Naglasak je na efikasnom računanju s nizovima, vektorima i matricama, uključivo višedimenzionalne stukture. Napisan je u C-u i Fortanu te koristi BLAS biblioteku.
Kreiranje nizova pomoću numpy
modula
Možemo koristiti i funkcije numpy.shape
, numpy.size
Koja je razlika između numpy.ndarray
tipa i standardnih lista u Pythonu?
liste u Pythonu mogu sadržavati bilo kakve vrste objekata, to nije slučaj s
numpy.ndarray
numpy.ndarray
nisu dinamički objekti: pri kreiranju im je određen tipza
numpy.ndarray
implementirane su razne efikasne metode važne u numericide facto sva računanja se odvijaju u C-u i Fortranu pomoću BLAS rutina
dtype
(data type) nam daje informaciju o tipu podataka u nizu:
Kako je M statički objekt, ne možemo napraviti ovo:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-31-a09d72434238> in <module>()
----> 1 M[0,0] = "hello"
ValueError: invalid literal for int() with base 10: 'hello'
Naravno, ovo je ok:
dtype
se može eksplicitno zadati:
Tipično dtype
su: int
, float
, complex
, bool
, object
, itd.
Ali možemo biti i eksplicitni vezano za veličinu registra: int64
, int16
, float128
, complex128
.
Funkcije koje generiraju nizove
Učitavanje podataka
Često učitavamo podatke iz datoteka (lokalno ili s weba). Važni formati su cvs (comma-separated values) i tsv (tab-separated values).
1850,-0.211
1851,-0.403
1852,0.334
1853,-0.762
1854,-0.019
1855,-0.961
1856,-0.243
1857,0.420
1858,-0.059
1859,0.018
Uz numpy.savetxt
možemo napraviti i obrnuto.
9.387591161588458855e-01 4.321500444939530006e-01 2.312998801967627305e-01
1.359315283144698627e-01 4.136650288835774791e-02 2.145849165333063580e-01
9.626157155774026641e-01 2.237277861211310892e-01 4.447824126746069417e-01
0.93876 0.43215 0.23130
0.13593 0.04137 0.21458
0.96262 0.22373 0.44478
Postoji i interni format za numpy
nizove:
random-matrix.npy: data
Rad s nizovima
Indeksiranje funkcionira standardno.
Naravno, možemo koristiti i :
operator:
S negativnim indeksima računamo od kraja niza:
Naravno, iste operacije imamo i za višedimenzionalne nizove.
Možemo koristiti i tzv. maske: ako je maska numpy
niz tipa bool
, tada se izabiru oni elementi koji u maski odgovaraju vrijednosti True
.
Zanimljiviji primjer:
Funkcije na nizovima
U sljedećem primjeru take
djeluje na listu, a izlaz je array
:
Funkcija choose
:
Što radi ova funkcija?
Vektorizacija koda
Što je više operacija s nizovima, to će kod generalno biti brži.
Defaultne operacije na nizovima su uvijek definirane po elementima.
Kako doći do standardnog umnoška?
Matrice mogu biti i višedimenzionalne
Postoji i tip matrix
. Kod njega operacije +, -, *
se ponašaju onako kako smo navikli.
Naravno, dimenzije trebaju biti kompatibilne.
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-138-995fb48ad0cc> in <module>()
----> 1 M * v
/projects/anaconda3/lib/python3.5/site-packages/numpy/matrixlib/defmatrix.py in __mul__(self, other)
341 if isinstance(other, (N.ndarray, list, tuple)) :
342 # This promotes 1-D vectors to row vectors
--> 343 return N.dot(self, asmatrix(other))
344 if isscalar(other) or not hasattr(other, '__rmul__') :
345 return N.dot(self, other)
ValueError: shapes (5,5) and (6,1) not aligned: 5 (dim 1) != 6 (dim 0)
Još neke funkcije: inner
, outer
, cross
, kron
, tensordot
.
Adjungiranje:
Za izvlačenje realnog, odnosno imaginarnog dijela: real
i imag
:
Izvlačenje osnovih informacija iz nizova
Prosječna dnevna temperatura u Stockholmu u zadnjiih 200 godina je bila 6.2 C.
Naravno, sve ove operacije možemo raditi na dijelovima nizova.
1800 1 1 -6.1 -6.1 -6.1 1
1800 1 2 -15.4 -15.4 -15.4 1
1800 1 3 -15.0 -15.0 -15.0 1
Format je: godina, mjesec, dan, prosječna dnevna temperatura, najniža, najviša, lokacija.
Recimo da nas zanimaju samo temperature u veljači.
Sada nije problem doći do histograma za prosječne mjesečne temperature u par redaka.
Rad s višedimenzionalnim podacima
Oblik niza se može promijeniti bez da se dira memorija, dakle mogu se primijenjivati i na veliku količinu podataka.
Funkcija flatten
radi kopiju.
Kopiranje nizova
Ako želimo napraviti novu kopiju, koristimo funkciju copy
:
Funkcija enumerate
nam daje i element i njegov indeks:
Vektorizacija funkcija
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-198-6658efdd2f22> in <module>()
----> 1 Theta(array([-3,-2,-1,0,1,2,3]))
<ipython-input-197-840f7d4ff406> in Theta(x)
3 Sklarna verzija step funkcije.
4 """
----> 5 if x >= 0:
6 return 1
7 else:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
To smo mogli napraviti i ručno.
Eksplicitno pretvaranje podataka. Uvijek stvara novi niz.
Python verzija | 3.5.3 |
kompajler | GCC 4.8.2 20140120 (Red Hat 4.8.2-15) |
sustav | Linux |
broj CPU-a | 8 |
interpreter | 64bit |
numpy verzija | 1.11.3 |
matplotlib verzija | 2.0.0 |
Zadaci za vježbu
Matrica reda 5 je dobijena s
A=random.randn(5,5)
. Izvucite matricu iz gornjeg desnog kuta matrice . Pomnožite matricu s nekom drugom matricom te ubacite tu matricu u gornji lijevi kut matrice .Dan je kod
Izvršite ovaj kod. Objasnite zašto x
, y
i z
imaju iste vrijednosti.
Vektorizirajte kod iz 3. zadatka za vježbu iz prvog predavanja. Vektorizirana funkcija treba za argumente primati funkciju
f
i brojn
te dva nizaa,b
a vraćati niz brojeva koji odgovaraju aproksimaciji integrala trapeznom formulom.
Dana je funkcija Ovdje je realan broj, . Napišite vektoriziranu funkciju za računanje na skupu ekvidistribuiranih brojeva između 0 i 1 (dakle, bez korištenja petlji).
Neka su uniformno distribuirani slučajni brojevi između i . Tada se može aproksimirati s , postupak koji se obično zove Monte Carlo integracija. Napišite funkciju koja kao ulazne varijable prima , , te s predefiniranom vrijednošću 1000, a vraća rezultat Monte Carlo integracije. I u ovom zadatku se ne smiju koristiti petlje.