6.8. Operatori¶
Primul tip de operații matematice pe care numpy le rulează asupra unui ndarray sunt operatorii Python standard. Operatorii aritmetici, de comparație și pe biți funcționează toți element cu element – fiecare operator parcurge tabloul (sau ambele tablouri) o singură dată, de la început până la sfârșit, în cadrul unui singur apel de bibliotecă, mult mai rapid decât bucla Python for echivalentă.
6.8.1. Aritmetică¶
+, -, *, /, //, %, ** funcționează toate între două tablouri de formă compatibilă sau între un tablou și un scalar:
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])
Dtype-ul rezultatului urmează regulile de promovare (upcasting) descrise în Dtype-uri. Tablourile întregi se rearanjează circular la depășire (overflow); convertește la un dtype mai larg înainte de operație când acest lucru contează.
Operatorul de înmulțire matricială @ nu este implementat. Folosește dot() pentru produse matrice / vector.
6.8.1.1. Forme pe loc¶
Fiecare operator aritmetic are o formă pe loc – +=, -=, *=, /=, %=, **=. Forma pe loc scrie direct în tamponul existent în loc să aloce unul temporar:
b = b + 1 # allocates a temporary the size of b
b += 1 # no temporary
Pe un microcontroler, a doua formă este practic obligatorie pentru orice buclă critică (hot loop).
6.8.2. Pe biți¶
Operatorii pe biți &, |, ^ funcționează element cu element pe tablouri de întregi. Aplicați unui tablou float sau complex, ridică 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)
Operatorul unar ~ efectuează NOT pe biți asupra unui tablou de întregi.
Operatorii de deplasare << și >> nu sunt conectați la nivelul operatorilor Python. Formele funcție left_shift() și right_shift() funcționează:
np.left_shift(a, 2)
np.right_shift(b, 1)
6.8.3. Comparație¶
==, !=, <, <=, >, >= returnează toate un ndarray de tip bool cu forma de broadcast:
a = np.array([1, 2, 3, 4, 5], dtype=np.uint8)
print(a < 3)
# array([True, True, False, False, False], dtype=bool)
Rezultatul boolean este exact ceea ce consumă indexarea și Selectare și rearanjare.
6.8.3.1. Regula laturii¶
ndarray trebuie să fie în stânga unui operator relațional atunci când se compară cu un scalar. a > 2 funcționează; 2 < a ridică TypeError. Pentru forma simetrică, folosește numele de funcții:
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. Operatori unari¶
+a– returnează o copie a tabloului.-a– negare. Pe dtype-urile fără semn, valorile se rearanjează circular modulo \(2^N\), la fel cum o fac operatorii binari.abs(a)– valoarea absolută element cu element. Pe dtype-urile fără semn returnează o copie fără calcul.~a– inversare pe biți (doar tablouri de întregi).len(a)– returnează lungimea primei axe, conform convenției Python pentru secvențe.
6.8.5. Ce lipsește¶
Operatorii din partea dreaptă pentru comparație și pentru unele dintre operațiile pe biți nu sunt implementați în același mod ca operatorii aritmetici. Folosește formele funcție (de mai sus) atunci când un ndarray ar ajunge în partea dreaptă.
Pentru lista completă a operatorilor acceptați și promovarea (upcasting) pe care o urmează, vezi numpy — operații pe tablouri compatibile numpy.