NumPy-taulukot (array)

NumPy-taulukoita ja muita NumPyn ominaisuuksia käytettäessä ohjelmaan pitää aina tuoda numpy-moduuuli import-käskyllä. Tällä kurssilla moduuli tuodaan aina seuraavalla käskyllä, jolloin NumPyn funktioita voi kutsua lyhennettä np käyttäen:

import numpy as np

Taulukoiden luominen ja alkioihin viittaaminen

Taulukoita (array) voi luoda suoraviivaisesti numpy.array-funktion avulla.

Yksiulotteiset taulukot (vektorit)

Luodaan yksiulotteinen neljan alkion taulukko (eli vektori)

vektori = np.array([10, 20, 30, 40])
# indeksi:           0   1   2   3

Taulukon ulottuvuus (engl. dimension) tarkoittaa, montako indeksiä tarvitaan yhden alkion osoittamiseen. Yksiulotteisen esimerkkivektorin tapauksessa tarvitsemme vain yhden indeksin, joka saa arvot 0-3.

Taulukon alkiohin viittaaminen toimii kuten listojen kanssa (muista, että ensimmainen indeksi on 0):

eka = vektori[0] # 10
toka = vektori[1] # 20
vika_1 = vektori[3] # 40
vika_2 = vektori[-1] # 40
Kaksiulotteiset taulukot (matriisit)

Luodaan kaksiulotteinen kahden rivin ja kolmen sarakkeen taulukko (eli matriisi):

matriisi = np.array([[10, 20, 30],
                     [40, 50, 60]])

Erona tavallisiin listoihin kaksiulotteisten NumPy-taulukkojen alkioihin voi viitata käytännöllisellä taulukko[rivi, sarake] -merkinnällä:

ekan_rivin_eka_sarake = M[0, 0] # 10
tokan_rivin_toka_sarake = M[1, 1] # 50
tokan_rivin_vika_sarake = M[1, -1] # 60

Myös tavallisista listoista tuttu merkintä taulukko[rivi][sarake] toimii, mutta se on kömpelömpi käyttää.

Kolmiulotteiset taulukot

Luodaan viimeisenä esimerkkinä kolmiulotteinen 2 x 2 x 3 taulukko:

T = np.array([[[1, 2, 3],
               [4, 5, 6]],
               
              [[10, 20, 30],
               [40, 50, 60]
              ]])
alkio = T[1, 1, 0] # 40
Taulukon ulottuvuuksien tarkastelu (ndim, shape, len)

Minkä tahansa NumPy-taulukon ulottuvuuksien määrän voi selvittää ndim-funktiolla:

matriisi = np.array([[10, 20, 30],
                     [40, 50, 60]])
matriisin_ulottuvuus = np.ndim(matriisi) # palauttaa kokonaisluvun 2

shape-funktio palauttaa taulukon ulottuvuuksien dimensiot

# Käytetään yllä määriteltyä taulukkoa T
T_dimensiot = np.shape(T) # palauttaa monikon (2, 2, 3)

Tuttu len-funktio palauttaa taulukon halutun ulottuvuuden pituuden:

# Käytetään yllä määriteltyjä taulukoita vektori ja T
vektorin_pituus = len(vektori) # palauttaa kokonaisluvun 4
T_kolmas_ulottuvuus_pituus = len(T[0, 0]) # palauttaa kokonaisluvun 3
Taulukon suurimman tai pienimmän alkion indeksin etsiminen

NumPy-taulukon suurimman alkion indeksin voi etsiä argmax-funktiolla. Pienimmän alkion indeksi löytyy vastaavasti argmin-funktiolla. Jos tarvitset vain taulukon suurimman tai pienimmän arvon ilman indeksiä, käytä amax ja amin-funktioita:

luvut = np.array([3.1, 1.0, 0.4, 10.1])
print(f"Suurin luku: {np.amax(luvut):.1f}")
print(f"Suurimman luvun indeksi: {np.argmax(luvut):d}")
print(f"Pienin luku: {np.amin(luvut):.1f}")
print(f"Pienimmän luvun indeksi: {np.argmin(luvut):d}")

tulostaa

Suurin luku: 10.1
Suurimman luvun indeksi: 3
Pienin luku: 0.4
Pienimmän luvun indeksi: 2

Listojen muuntaminen taulukoiksi

Yllä käytetty numpy.array-funktio muuntaa tavallisen listan NumPy-taulukoksi. Seuraavassa esimerkissä vektori v1 luodaan kokonaislukujen listasta [1, 2, 3, 4, 5]:

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

Saman muunnoksen voi tehdä myös olemassaoleville listoille (tai monikoille):

lista = [1.1, 2.2, 3.3, 4.4]
v2 = np.array(lista)
# nyt v2 on array([ 1.1,  2.2,  3.3,  4.4])
M1 = np.array([lista, lista])
# Nyt M1 on kaksiulotteinen taulukko
# array([[ 1.1,  2.2,  3.3,  4.4],
#        [ 1.1,  2.2,  3.3,  4.4]])

Nollilla alustetun taulukon luominen

Joskus on tarpeellista luoda ensin tyhjä nollilla alustettu taulukko, johon voi sitten lisätä dataa myöhemmin. Nollilla alustetun taulukon voi luoda numpy.zeros-funktiolla:

vektori = np.zeros(8) # Kahdeksan alkiota pitkä vektori täynnä nollia
matriisi = np.zeros((9, 9)) # 9x9 matriisi täynnä nollia. zeros-funktion parametri on tässä monikko (9, 9).

Moniulotteisen taulukon tapauksessa numpy.zeros-funktion parametrin shape tulee olla monikko tai lista.

Kokonaislukuja sisältävien taulukoiden luominen arange-funktiolla

Kokonaislukuja sisältäviä taulukoita voi luoda range-funktiota vastaavalla numpy.arange-funktiolla:

v3 = np.arange(1, 10)
# np.arange(alku, loppu)
# Nyt v3 on array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# Huomaa, että viimenen alkio on loppu-1 (kuten range-funktiolla)

Myös muoto np.arange(alku, loppu, askel) on käytössä:

v4 = np.arange(2, 11, 2)
# Nyt v4 on array([ 2,  4,  6,  8, 10])

Liukulukuja sisältävien taulukoiden luominen linspace-funktiolla

Liukulukuja sisältäviä taulukoita voi luoda numpy.linspace-funktiolla, jota kutsutaan numpy.linspace(start, stop, num). Parametri start on ensimmäinen luku, stop on viimeinen luku ja num on lukujen määrä välillä start..stopHuomaa, etta oletuksena stop-luku tulee mukaan, toisin kuin arange-funktiossa!

v5 = np.linspace(0.1, 1, 10) 
# v5 on array([ 0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ])
v6 = np.linspace(-0.2, 0.2, 6) 
# v6 on array([-0.2 , -0.12, -0.04,  0.04,  0.12,  0.2 ])

Tällä kurssilla linspace-funktio on isossa roolissa esimerkiksi kuvaajia piirrettäessä. arange-funktiota käytämme vain vähän.

linspace-funktiota voi käyttää myös kokonaislukujen kanssa, mutta tällöin pitää vain tiedostaa, että tuloksena syntyvän taulukon luvut ovat liukulukuja, eivät kokonaislukuja:

v7 = np.linspace(-5, 5, 11)
# v7 on array([-5., -4., -3., -2., -1.,  0.,  1.,  2.,  3.,  4.,  5.])

Jos tarvitset tasavälisiä lukuja logaritmisella asteikolla, voit käyttää funktiota numpy.logspace

Tehtävä 4.2.1