Järjestatud, ühe või mitme indeksiga adresseeritavate elementide kogumit nimetatakse üldiselt massiiviks (array). Ühemõõtmelist arvumassiivi nimetatakse ka vektoriks. Üldotstarbeline Pythoni andmestruktuur mistahes elementide agregeerimiseks on järjend (andmetüüp list), mille saab mugavalt tekitada nurksulgude abil:

a = [1, 2, 3]
b = [10, 20, 30]

Järjend on realiseeritud põhimõttel, et sellele saaks elemente ühekaupa juurde lisada (meetodiga append). Kui nurksulgude asemel kasutada ümarsulge, tekib ennik (tuple), mille sisu on kirjutuskaitstud (elemente lisada, eemaldada või üle kirjutada ei saa). Nimetatud andmestruktuure nimetatakse kokkuvõtvalt jadadeks (sequence).

Jadad ei sobi üldiselt matemaatilisteks operatsioonideks, näiteks a + b ei anna tulemuseks mitte [11, 22, 33], vaid hoopis [1, 2, 3, 10, 20, 30], st ühendab algsed järjendid. Kui siiski tingimata tahta jadadega opereerida, oleks optimaalne umbes järgmine konstruktsioon (list comprehension):

c = [u + v for u, v in zip(a, b)]

Matemaatilisteks vajadusteks on ette nähtud NumPy andmestruktuur nimega ndarray. Selle saab defineerida näiteks käsuga numpy.array, millele tuleb anda elemendid Pythoni jadana:

a = np.array((1, 2, 3))
b = np.array((10, 20, 30))

Aritmeetilised operatsioonid selliste massiivide vahel rakenduvad automaatselt element-kaupa, nii et a + b tekitab nüüd tõepoolest uue massiivi, mille sisuks on (11, 22, 33). Algsed massiivid peavad muidugi olema ühilduvate mõõtmetega.

Lisaks on NumPy ja SciPy teekides põhjalik komplekt matemaatilisi funktsioone, mis samuti automaatselt rakenduvad kõigile massiivi elementidele. Sellisel viisil saab teostada keerulisi vektoriseeritud arvutusi ilma tsükleid kasutamata. Seejuures võib meelevaldselt segada omavahel skaalareid ja massiive. Massiivide (või NumPy teegi) koosseisus on mitmeid kasulikke meetodeid, sh statistilised funktsioonid, massiivi miinimumi või maksimumi leidmise funktsioonid, jpm. Näide:

# tavaline reaalarv ehk skaalar
p0 = 99.3

# mõõtmisandmed kolmest katsest
p1 = np.array((110.2, 111.42, 108.82))
p2 = np.array((101.64, 101.74, 101.32))

# vektoriseeritud arvutamine üle kõigi katsete
gamma = np.log(p1/p0) / np.log(p1/p2)  # tulemus (1.288, 1.267, 1.282)
print('Keskmine: %.3f' % gamma.mean())

Elementide ühekaupa juurdelisamine NumPy massiivile on ebaefektiivne ja seda tuleks vältida. Sellisel juhul tasub kasutada järjendit või reserveerida kohe alguses õige suurusega massiiv käsuga numpy.empty (või numpy.zeros või numpy.full, sõltuvalt olukorrast).

Vaata lisaks

Sisukord