2011-12-25 50 views
36

Ví dụ tôi muốn tạo ra một mặt nạ mà mặt nạ các yếu tố có giá trị từ 40 đến 60:Làm thế nào để thực hiện yếu tố khôn ngoan hoạt động boolean trên mảng NumPy

foo = np.asanyarray(range(100)) 
mask = (foo < 40).__or__(foo > 60) 

nào chỉ trông xấu xí, tôi không thể viết:

(foo < 40) or (foo > 60) 

vì tôi kết thúc với:

ValueError Traceback (most recent call last) 
    ... 
    ----> 1 (foo < 40) or (foo > 60) 
    ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

có cách nào kinh điển làm yếu tố khôn ngoan boolean ope khẩu phần trên mảng numpy với mã tìm kiếm tốt?

Trả lời

55

Bạn đã thử điều này chưa?

mask = (foo < 40) | (foo > 60) 

Lưu ý: __or__ phương pháp trong một đối tượng quá tải Bitwise hoặc điều hành (|), không phải là or điều hành boolean.

+1

Oh rõ rằng thực sự là ngu ngốc của tôi. Tất nhiên nó hoạt động :) –

+0

nó không hoạt động: TypeError: ufunc 'bitwise_or' không được hỗ trợ cho kiểu đầu vào và đầu vào không thể được ép buộc an toàn vào bất kỳ loại được hỗ trợ nào theo quy tắc truyền '' an toàn '' – Mehdi

+4

Don Đừng quên đặt đúng các biểu thức của bạn – gota

13

Nếu bạn có so sánh chỉ trong các phép toán, như trong ví dụ của bạn, bạn có thể sử dụng toán tử OR theo bitwise | theo đề xuất của Jcollado. Nhưng hãy cẩn thận, điều này có thể cung cấp cho bạn kết quả lạ nếu bạn đã từng sử dụng các boolean không, chẳng hạn như mask = (foo < 40) | override. Chỉ miễn là override được đảm bảo là False, True, 1 hoặc 0, bạn có ổn không.

Thông tin chung hơn là việc sử dụng toán tử nhóm so sánh của nhóm, np.anynp.all. Đoạn này trả về tất cả các giá trị từ 35 đến 45 là ít hơn 40 hoặc không phải là một bội số của 3:

import numpy as np 
foo = np.arange(35, 46) 
mask = np.any([(foo < 40), (foo % 3)], axis=0) 
print foo[mask] 
OUTPUT: array([35, 36, 37, 38, 39, 40, 41, 43, 44]) 

Không đẹp như với |, nhưng đẹp hơn so với mã trong câu hỏi của bạn.

+0

Đó là một điểm vaid! –

+0

Bạn nên sử dụng 'np.any' và' np.all' cụ thể. – htredleaf

1

Lưu ý rằng bạn có thể sử dụng ~ để phủ định theo nguyên tắc.

arr = np.array([False, True]) 
~arr 

OUTPUT: array([ True, False], dtype=bool) 

Cũng & không elementwise

arr_1 = np.array([False, False, True, True]) 
arr_2 = np.array([False, True, False, True]) 

arr_1 & arr_2 

OUTPUT: array([False, False, False, True], dtype=bool) 

Đây cũng làm việc với Pandas Dòng

ser_1 = pd.Series([False, False, True, True]) 
ser_2 = pd.Series([False, True, False, True]) 

ser_1 & ser_2 

OUTPUT: 
0 False 
1 False 
2 False 
3  True 
dtype: bool 
+0

Theo tài liệu khó khăn, nó có vẻ như '&' làm [_bitwise_ và] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.bitwise_and.html#numpy.bitwise_and), chứ không phải theo nguyên tắc . – HelloGoodbye

Các vấn đề liên quan