Lý do cho ngoại lệ là and
các cuộc gọi ngầm bool
. Đầu tiên trên toán hạng bên trái và (nếu toán hạng bên trái là True
) sau đó trên toán hạng bên phải. Như vậy x and y
là tương đương vớibool(x) and bool(y)
.
Tuy nhiên, bool
trên một numpy.ndarray
(nếu nó chứa nhiều hơn một phần tử) sẽ đưa ra ngoại lệ bạn đã thấy:
>>> import numpy as np
>>> arr = np.array([1, 2, 3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Các bool()
cuộc gọi là trong tiềm ẩn and
, mà còn trong if
, while
, or
, vì vậy bất kỳ trong những ví dụ sau đây cũng sẽ thất bại:
>>> arr and arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> if arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> while arr: pass
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> arr or arr
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Có nhiều hàm và câu lệnh trong Python ẩn bool
các cuộc gọi, ví dụ 2 < x < 10
chỉ là một cách viết khác 2 < x and x < 10
. Và ý and
chí sẽ gọi bool
: bool(2 < x) and bool(x < 10)
.
Các yếu tố khôn ngoan tương đương cho and
sẽ là np.logical_and
chức năng, tương tự bạn có thể sử dụng np.logical_or
như tương đương cho or
.
Đối với mảng boolean - và so sánh thích <
, <=
, ==
, !=
, >=
và >
trên NumPy mảng trở lại mảng NumPy boolean - bạn cũng có thể sử dụng các yếu tố khôn ngoan Bitwise chức năng (và các nhà khai thác): np.bitwise_and
( &
nhà điều hành)
>>> np.logical_and(arr > 1, arr < 3)
array([False, True, False], dtype=bool)
>>> np.bitwise_and(arr > 1, arr < 3)
array([False, True, False], dtype=bool)
>>> (arr > 1) & (arr < 3)
array([False, True, False], dtype=bool)
và bitwise_or
( |
nhà điều hành):
>>> np.logical_or(arr <= 1, arr >= 3)
array([ True, False, True], dtype=bool)
>>> np.bitwise_or(arr <= 1, arr >= 3)
array([ True, False, True], dtype=bool)
>>> (arr <= 1) | (arr >= 3)
array([ True, False, True], dtype=bool)
Một danh sách đầy đủ các hàm logic và nhị phân có thể được tìm thấy trong tài liệu NumPy: