6.8. Operaattorit

Ensimmäinen matematiikan laji, jota numpy ajaa ndarray-oliolle, ovat tavalliset Python-operaattorit. Aritmetiikka-, vertailu- ja bittioperaattorit toimivat kaikki alkioittain – kukin operaattori käy taulukon (tai molemmat taulukot) läpi kerran alusta loppuun yhden kirjastokutsun sisällä, paljon nopeammin kuin vastaava Python-silmukka for.

6.8.1. Aritmetiikka

+, -, *, /, //, %, ** toimivat kaikki kahden yhteensopivan muotoisen taulukon välillä tai taulukon ja skalaarin välillä:

a = np.array([1, 2, 3, 4], dtype=np.float)
b = np.array([10, 20, 30, 40], dtype=np.float)

print(a + b)        # array([11.0, 22.0, 33.0, 44.0])
print(a * 2)        # array([2.0, 4.0, 6.0, 8.0])
print(b - a)        # array([9.0, 18.0, 27.0, 36.0])
print(b / a)        # array([10.0, 10.0, 10.0, 10.0])

Tuloksen dtype noudattaa kohdassa Dtype-tyypit kuvattuja ylennyssääntöjä. Kokonaislukutaulukot kiertyvät ylivuodossa; muunna leveämpään dtypeen ennen operaatiota, kun sillä on merkitystä.

Matriisikertolaskuoperaattoria @ ei ole toteutettu. Käytä funktiota dot() matriisi- ja vektorituloihin.

6.8.1.1. Paikallaan tapahtuvat muodot

Jokaisella aritmeettisella operaattorilla on paikallaan tapahtuva muoto – +=, -=, *=, /=, %=, **=. Paikallaan tapahtuva muoto kirjoittaa olemassa olevan puskurin läpi sen sijaan, että varaisi väliaikaisen:

b = b + 1            # allocates a temporary the size of b
b += 1               # no temporary

Mikrokontrollerissa toinen muoto on käytännössä pakollinen mille tahansa kuumalle silmukalle.

6.8.2. Bittioperaatiot

Bittioperaattorit &, |, ^ toimivat alkioittain kokonaislukutaulukoilla. float- tai complex-taulukolle sovellettuna ne nostavat poikkeuksen TypeError

a = np.array([0b1100, 0b1010], dtype=np.uint8)
b = np.array([0b1010, 0b1100], dtype=np.uint8)
print(a & b)        # array([8, 8], dtype=uint8)
print(a | b)        # array([14, 14], dtype=uint8)
print(a ^ b)        # array([6, 6], dtype=uint8)

Yksioperandinen ~ suorittaa bittikohtaisen NOT-operaation kokonaislukutaulukolle.

Siirto-operaattoreita << ja >> ei ole kytketty Python-operaattoritasolle. Funktiomuodot left_shift() ja right_shift() toimivat:

np.left_shift(a, 2)
np.right_shift(b, 1)

6.8.3. Vertailu

==, !=, <, <=, >, >= palauttavat kaikki bool-tyyppisen ndarray:n levityksen muodossa:

a = np.array([1, 2, 3, 4, 5], dtype=np.uint8)
print(a < 3)
# array([True, True, False, False, False], dtype=bool)

Totuusarvotulos on juuri sitä, mitä indeksointi ja Valinta ja uudelleenjärjestely käyttävät.

6.8.3.1. Puolisääntö

ndarray:n on oltava relaatio-operaattorin vasemmalla puolella skalaariin verrattaessa. a > 2 toimii; 2 < a nostaa poikkeuksen TypeError. Symmetristä muotoa varten käytä funktioiden nimiä:

np.greater(5, a)        # 5 > a, element-wise
np.less(5, a)           # 5 < a, element-wise
np.equal(5, a)          # 5 == a, element-wise
np.not_equal(5, a)      # 5 != a, element-wise

6.8.4. Yksioperandiset operaattorit

  • +a – palauttaa taulukon kopion.

  • -a – negaatio. Etumerkittömissä dtypeissä arvot kiertyvät modulo \(2^N\), samalla tavalla kuin binäärioperaattorit tekevät.

  • abs(a) – alkioittainen itseisarvo. Etumerkittömissä dtypeissä palauttaa kopion ilman laskentaa.

  • ~a – bittikohtainen inversio (vain kokonaislukutaulukot).

  • len(a) – palauttaa ensimmäisen akselin pituuden Pythonin sekvenssikäytännön mukaisesti.

6.8.5. Mitä puuttuu

Vertailun ja joidenkin bittioperaatioiden oikeanpuoleisia operaattoreita ei ole toteutettu samalla tavalla kuin aritmeettiset operaattorit. Käytä funktiomuotoja (yllä), kun ndarray jäisi oikealle puolelle.

Täydellisen listan tuetuista operaattoreista ja niiden noudattamasta ylennyksestä löydät kohdasta numpy — numpy-yhteensopivat taulukko-operaatiot.