6.8. Toán tử¶
Loại toán học đầu tiên mà numpy thực thi trên một ndarray là các toán tử Python tiêu chuẩn. Các toán tử số học, so sánh và bit đều hoạt động theo từng phần tử -- mỗi toán tử duyệt mảng (hoặc cả hai mảng) một lần từ đầu đến cuối trong một lệnh gọi thư viện duy nhất, nhanh hơn nhiều so với vòng lặp for Python tương đương.
6.8.1. Số học¶
+, -, *, /, //, %, ** đều hoạt động giữa hai mảng có hình dạng tương thích, hoặc giữa một mảng và một vô hướng:
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 kết quả tuân theo các quy tắc nâng cấp được mô tả tại Dtypes. Mảng nguyên bị tràn sẽ bao vòng; hãy chuyển sang dtype rộng hơn trước phép toán khi điều đó quan trọng.
Toán tử nhân ma trận @ không được triển khai. Dùng dot() cho các tích ma trận / vectơ.
6.8.1.1. Dạng in-place¶
Mỗi toán tử số học đều có dạng in-place -- +=, -=, *=, /=, %=, **=. Dạng in-place ghi thẳng vào bộ đệm hiện có thay vì cấp phát bộ đệm tạm:
b = b + 1 # allocates a temporary the size of b
b += 1 # no temporary
Trên vi điều khiển, dạng thứ hai về cơ bản là bắt buộc cho bất kỳ vòng lặp nóng nào.
6.8.2. Bitwise¶
Các toán tử bit &, |, ^ hoạt động theo từng phần tử trên mảng nguyên. Áp dụng cho mảng float hoặc complex chúng ném 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)
Toán tử một ngôi ~ thực hiện phép NOT bitwise trên mảng nguyên.
Các toán tử dịch bit << và >> không được kết nối ở cấp toán tử Python. Các dạng hàm left_shift() và right_shift() hoạt động:
np.left_shift(a, 2)
np.right_shift(b, 1)
6.8.3. So sánh¶
==, !=, <, <=, >, >= đều trả về một ndarray bool có hình dạng phát sóng:
a = np.array([1, 2, 3, 4, 5], dtype=np.uint8)
print(a < 3)
# array([True, True, False, False, False], dtype=bool)
Kết quả boolean chính xác là những gì chỉ mục và lựa chọn sử dụng.
6.8.3.1. Quy tắc về phía¶
ndarray phải ở bên trái của toán tử quan hệ khi so sánh với vô hướng. a > 2 hoạt động; 2 < a ném TypeError. Để có dạng đối xứng, hãy dùng tên hàm:
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. Toán tử một ngôi¶
+a-- trả về một bản sao của mảng.-a-- phủ định. Trên các dtype không dấu, các giá trị bao vòng theo modulo \(2^N\), giống như các toán tử nhị phân.abs(a)-- giá trị tuyệt đối theo từng phần tử. Trên các dtype không dấu, trả về bản sao mà không tính toán.~a-- đảo bit (chỉ dành cho mảng nguyên).len(a)-- trả về độ dài của trục đầu tiên, khớp với quy ước chuỗi Python.
6.8.5. Những gì còn thiếu¶
Các toán tử vế phải cho so sánh và một số phép toán bit không được triển khai theo cách giống như các toán tử số học. Hãy dùng các dạng hàm (ở trên) khi một ndarray sẽ nằm ở bên phải.
Để có danh sách đầy đủ các toán tử được hỗ trợ và quy tắc nâng cấp chúng tuân theo, xem numpy --- các phép toán mảng tương thích numpy.