6.8. Operator¶
Jenis matematika pertama yang dijalankan numpy pada ndarray adalah operator Python standar. Operator aritmatika, perbandingan, dan bit-wise semuanya bekerja elemen-demi-elemen -- setiap operator menelusuri array (atau kedua array) sekali dari awal hingga akhir di dalam satu panggilan library, jauh lebih cepat daripada loop Python for yang setara.
6.8.1. Aritmatika¶
+, -, *, /, //, %, ** semuanya bekerja antara dua array dengan bentuk yang kompatibel, atau antara array dan skalar:
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 hasil mengikuti aturan upcasting yang dijelaskan pada Dtype. Array integer membungkus saat overflow; lakukan cast ke dtype yang lebih lebar sebelum operasi jika itu penting.
Operator perkalian matriks @ tidak diimplementasikan. Gunakan dot() untuk perkalian matriks / vektor.
6.8.1.1. Bentuk in-place¶
Setiap operator aritmatika memiliki bentuk in-place -- +=, -=, *=, /=, %=, **=. Bentuk in-place menulis melalui buffer yang sudah ada alih-alih mengalokasikan sementara:
b = b + 1 # allocates a temporary the size of b
b += 1 # no temporary
Pada mikrokontroler, bentuk kedua pada dasarnya wajib untuk setiap loop kritis.
6.8.2. Bitwise¶
Operator bit-wise &, |, ^ bekerja elemen-demi-elemen pada array integer. Diterapkan pada array float atau complex, mereka memunculkan 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)
Unary ~ melakukan NOT bit-wise pada array integer.
Operator shift << dan >> tidak terhubung di tingkat operator Python. Bentuk fungsi left_shift() dan right_shift() bekerja:
np.left_shift(a, 2)
np.right_shift(b, 1)
6.8.3. Perbandingan¶
==, !=, <, <=, >, >= semuanya mengembalikan bool ndarray dengan bentuk broadcast:
a = np.array([1, 2, 3, 4, 5], dtype=np.uint8)
print(a < 3)
# array([True, True, False, False, False], dtype=bool)
Hasil boolean adalah tepat apa yang dikonsumsi oleh pengindeksan dan seleksi.
6.8.3.1. Aturan sisi¶
ndarray harus berada di kiri operator relasional saat membandingkan dengan skalar. a > 2 berfungsi; 2 < a memunculkan TypeError. Untuk bentuk simetris, gunakan nama fungsi:
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. Operator unary¶
+a-- mengembalikan salinan array.-a-- negasi. Pada dtype unsigned, nilai membungkus modulo \(2^N\), sama seperti yang dilakukan operator biner.abs(a)-- nilai absolut elemen-demi-elemen. Pada dtype unsigned mengembalikan salinan tanpa komputasi.~a-- inversi bit-wise (hanya array integer).len(a)-- mengembalikan panjang sumbu pertama, sesuai konvensi urutan Python.
6.8.5. Apa yang hilang¶
Operator sisi-kanan untuk perbandingan dan sebagian operasi bit-wise tidak diimplementasikan dengan cara yang sama seperti operator aritmatika. Gunakan bentuk fungsi (di atas) ketika ndarray akan berada di sisi kanan.
Untuk daftar lengkap operator yang didukung dan upcasting yang diikutinya, lihat numpy --- operasi array yang kompatibel dengan numpy.