Rad s Python modulom numpy
Note
Ovaj dio je sastavljen prema NumPy tutorialu.
Uključivanje modula numpy
najčešće se vrši naredbom:
import numpy as np
Rad s poljima
-
numpy.array(..., dtype=tip)
-- prima listu kao argument;dtype
može biti bilo koji od standardnih Python tipova:int
,float
,complex
, ...a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]) b = np.array([[3.5, 4.2, 8.7, 11.3, 0.7]])
np.array.shape
-- obliknp.array.ndim
-- dimenzijanp.array.size
-- veličina (ukupan broj elemenata)-
np.array.dtype
-- tip podataka, moguće ga je specificirati prilikom stvaranjac = np.array([[3, 11], [7, 9]], dtype=complex)
-
np.array.itemsize
-- veličina (u bajtovima) tipa podataka od kojih se polje sastoji
Zadatak
-
Stvorite polje s vrijednostima
9 13 5 1 11 7 3 7 2 6 0 7
-
Saznajte mu oblik, duljinu i tip elemenata i veličinu elementa u bajtovima.
- Stvorite polje s istim vrijednostima, ali tako da su elementi tipa
float
.
numpy.zeros((n, m)), dtype=...)
stvara polje nulanumpy.ones((n, m), dtype=...)
stvara polje jedinica
Tipovi podataka definirani unutar modula numpy
; potrebno koristiti kad radite Python kod koji integira s C/C++ kodom:
numpy.int8
-- pandan C/C++ tipuchar
numpy.int16
-- pandan C/C++ tipushort int
numpy.int32
-- pandan C/C++ tipuint
(ne uvijek!)numpy.int64
-- pandan C/C++ tipulong
(ne uvijek!)numpy.float32
-- pandan C/C++ tipufloat
numpy.float64
-- pandan C/C++ tipudouble
Note
Duljina tipova podataka int
i long
u C/C++-u varira ovisno o tome koristi li se 32-bitni ili 64-bitni operacijski sustav. Na većini platformi danas koriste se dva modela:
- ILP32 --
int
,long
i pointer su duljine 32 bita, - LP64 --
long
i pointer su duljine 64 bita (zaint
se implicitno pretpostavlja da je duljine 32 bita).
Više informacija o tome možete naći u članku 64-Bit Programming Models: Why LP64?.
Zadatak
- Stvorite polje nula oblika
(5, 5)
u kojem su elementi tipanumpy.float32
. - Stvorite polje jedinica oblika
(1000, 1000)
. Pokušajte ga ispisati naredbomprint
. Što se dogodi?
Operacije na poljima
a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
# operacije koje rade element po element
c = a + b
d = b - a
e = a ** 2
f = a * b
g = np.sin(a)
h = np.exp(b)
# operacije koje mijenjaju početni array
a += b
b *= 3
Zadatak
- Stvorite dva dvodimenzionalna polja
a
ib
oblika(3, 3)
s proizvoljnim vrijednostima, i to tako da prvo ima elemente tipanumpy.float32
, a drugo elemente tipanumpy.float64
. - Izračunajte
2 * a + b
,cos(a)
,sqrt(b)
. Uočite kojeg su tipa polja koja dobivate kao rezultate. - Množenje matrica izvodite funkcijom
numpy.dot()
; proučite njenu dokumentaciju i izvedite ju na svojim poljima.
Pretvorba tipa
-
numpy.array.astype(type)
vraća polje s vrijednostima kao u početnom polju, ali tipa promijenjenog utype
- korisno kod pretvorbe, primjerice, 64-bitnog
float
tipa u 32-bitnifloat
tip - često ćemo koristiti kod Python koda koji prosljeđuje podatke u C/C++ kod
- korisno kod pretvorbe, primjerice, 64-bitnog
Zadatak
Iskoristite dva dvodimenzionalna polja iz prethodnog zadatka da izračunajte 2 * a + b
, ali tako da pretvorite drugo u polje koje ima elementa tipa numpy.float32
.
-
numpy.round(polje, broj_decimala)
vraća polje s vrijednostima zaokruženim na navedeni broj decimala- korisno kod usporedbe decimalnih brojeva, zbog nepreciznog spremanja brojeva u računalu (naročito se vidi kod konverzije podataka tipa
numpy.float64
u podatke tipanumpy.float32
) - strip sa Saturday Morning Breakfast Cereal na istu temu
- korisno kod usporedbe decimalnih brojeva, zbog nepreciznog spremanja brojeva u računalu (naročito se vidi kod konverzije podataka tipa
Zadatak
- Stvorite polje u kojem su sve vrijednosti jednake 9.45 tipa
float64
i pretvorite ga u polje tipafloat32
i rezultat spremite u novo polje. Uočavate li gubitak preciznosti? - Pretvorite dobiveno polje tipa
float32
u polje tipafloat64
. Je li rezultat jednak početnom polju? - Iskoristite round da na rezultirajućem polju tipa
float64
dobijete iste vrijednosti kao na početnom.
Napomena: rezultat ovog zadatka uvelike ovisi o računalu na kojem radite.
Hint
Na temu aritmetike brojeva s pomičnim zarezom napisani su brojni radovi od kojih svakako vrijedi pročitati What Every Computer Scientist Should Know About Floating-Point Arithmetic.
Čitanje polja iz datoteka
Imamo li datoteku podaci.txt
sadržaja
2.4 5.6 29
2 824919 11
27.3 6.1429 9.1
Modul numpy
nudi funkciju numpy.loadtxt()
koja prima
import numpy as np
podaci = open("podaci.txt")
matrica = np.loadtxt(podaci)
podaci.close()
Zadatak
- Stvorite dvije datoteke, nazovite ih
matrica_a.txt
imatrica_b.txt
. Matrica u prvoj datoteci neka bude oblika(3, 5)
, a u drugoj datoteci oblika(5, 4)
. - Izvršite čitanje podataka, a zatim izračunajte produkt dvaju matrica. Možete li izračunati oba produkta ili samo jedan? Objasnite zašto.
Posebne funkcije za generiranje polja
np.arange()
np.linspace()
np.ogrid()
np.mgrid()
Todo
Ovdje nedostaje objašnjenje i zadatak.
Indeksiranje, cijepanje i iteriranje polja
Jednodimenzionalna i višedimenzionalna polja možemo indeksirati, cijepati, iterirati i manipulirati baš kao i liste i znakovne nizove.
Zadatak
Stvorite jednodimenzionalno polje a
proizvoljnih cijelobrojnih vrijednosti veličine 10 te isprobajte iduće naredbe:
a[3]
a[2:6]
a[:8:2] = 1337
a[[1,3,4]] = 0
a[::-2]
a[0] * a[2] -1
a[[0,0,2]] = [1,2,3]
Zadatak
Stvorite višedimenzionalno polje a
proizvoljnih cijelobrojnih vrijednosti oblika (5,4) te isprobajte iduće naredbe:
a[2]
a[-1]
a[2:3]
a[0:4, 2]
a[::-2]
b[1:3, : ]
Zadatak
Stvorite jednodimenzionalno polje a
proizvoljnih cijelobrojnih vrijednosti veličine 10 i listu i = [1,3,5,9]
te isprobajte iduće naredbe:
a[i]
a[i][2]
a[i][1:3]
a[i][:-1]
a[i] * a[i][1]
a[i]**2 + i
a[i] / i[1]
np.sin(a[i]) * np.cos(i[2])
Manipulacija oblicima polja
Oblik polja možemo mijenjati idućim funkcijama:
np.array.ravel()
-- sravanavanje višedimenzionalnog poljanp.array.transpose()
-- transponiranje poljanp.array.reshape()
-- na mjestu vraća polje promjenjenog oblikanp.array.resize()
-- promjena oblika polja
Zadatak
Stvorite višedimenzionalno polje a
proizvoljnih cijelobrojnih vrijednosti oblika (5,4). Učinite iduće:
- Trajno promijenite oblik polja u (2,10).
- Transponirajte polje uz povećavanje svih vrijednosti polja za kosinus od 5.
- Stvorite jednodimenzionalno polje
b
preoblikovanjem poljaa
tako da su vrijednosti elementa ub
dvostruko veće od vrijednosti elemenata iza
.
Spajanje i razdvajanje polja možemo vršiti idućim funkcijama:
np.vstack()
-- vertikalno spajanjenp.hstack()
-- horizontalno spajanjenp.column_stack()
-- dodavanje jednodimenzionalnih polja kao stupce na dvodimenzionalna poljanp.row_stack()
-- dodavanje jednodimenzionalnih polja kao redove na dvodimenzionalna poljanp.concatenate()
-- spajanje polja po određenoj osi poljanp.hsplit()
-- horizontalno razdvajanjenp.vsplit()
-- vertikalno razdvajanje
Zadatak
Stvorite polje a
oblika (2,4) proizvoljnih cjelobrojnih vrijednosti.
- Funkcijom za horizontalno razdvajanje razdvojite
a
na dva jednaka dijela te rezultat spremite ub
. Kojeg tipa podataka jeb
. Što sadrži? - Nad
b
iskoristite funkcije za horizontalno te za vertikalno spajanje polja pa zatim usporedite dobivene rezultate. Kojeg su oblika dobivena polja?
Kopije objekata
Pridruživanje polja određenoj varijabli ne stvara se kopija objekta polja pa ni podataka koji ga sačinjavaju. Izmjenom vrijednosti u polju putem te varijable mijenjamo vrijednosti samog polja, primjerice:
>>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
>>> b = a
# Nije stvoren novi objekt
>>> b is a
True
>>> b.shape = 5,2
# Promjena objekta b mijenja i objekt a
>>> a.shape
(5, 2)
Kopiju možemo stvoriti funkcijom np.array.copy()
.
Zadatak
- Stvorite jednodimenzionalno polje
a
proizvoljnih cijelobrojnih vrijednosti veličine 10 te funkcijom stvorite objekta_kopija
koji je kopija objektaa
. - Promjenite proizvoljnu vrijednost polja
a_copy
te nakon toga promijenite oblik proizvoljnom funkcijom za mijenjanje oblika. - Usporedite sadržaj i oblik polja
a
ia_copy
. Što možete zaključiti? Je li promjena vrijednosti objektaa_copy
utjecala na vrijednosti objektaa
?
Polinomski fit
Numpy može izvesti fitanje polinoma na zadane točke korištenjem metode najmanjih kvadrata funkcijom numpy.polyfit()
(službena dokumentacija).
Author: Vedran Miletić, Domagoj Margan