2012-11-28 18 views
25

Nên là một câu hỏi đơn giản, nhưng tôi không thể tìm thấy câu trả lời ở bất cứ đâu. Toán tử ~ trong python được viết thành một toán tử đảo ngược bitwise. Khỏe. Tôi đã nhận thấy hành vi dường như tâm thần phân liệt tuy nhiên, để wit:python tilde unary operator dưới dạng phủ định mảng bool numpy

~True -> -2 
~1 -> -2 
~False -> -1 
~0 -> -1 
~numpy.array([True,False],dtype=int) -> array([-2,-1]) 
~numpy.array([True,False],dtype=bool) -> array([False,True]) 

Trong 4 ví dụ đầu tiên, tôi có thể nhìn thấy trăn rằng đang triển khai (như tài liệu) ~x = -(x+1), với đầu vào xử lý như một int ngay cả khi nó boolean . Do đó, đối với một boolean vô hướng, ~ không được coi là phủ định logic. Không phải là hành vi là giống hệt nhau trên một mảng numpy được xác định với các giá trị boolean bởi với một loại int.

Tại sao ~ sau đó hoạt động như toán tử phủ định hợp lý trên mảng boolean (Cũng chú ý: ~numpy.isfinite(numpy.inf) -> True?)?

Điều cực kỳ khó chịu là tôi phải sử dụng not() trên vô hướng, nhưng not() sẽ không hoạt động để phủ nhận một mảng. Sau đó cho một mảng, tôi phải sử dụng ~, nhưng ~ sẽ không làm việc để phủ nhận một vô hướng ...

Trả lời

26

not được thực hiện thông qua __nonzero__ phương pháp đặc biệt, được yêu cầu quay trở lại hoặc True hoặc False, vì vậy nó có thể' t đưa ra kết quả cần thiết. Thay vào đó, toán tử ~ được sử dụng, được triển khai thông qua phương thức đặc biệt __not__. Vì lý do tương tự, &| được sử dụng thay cho andor.

PEP 335 nhằm cho phép quá tải các toán tử boolean nhưng bị từ chối vì phí quá mức (ví dụ: phức tạp if câu lệnh). PEP 225 đề xuất cú pháp chung cho các toán tử "theo nguyên tắc", cung cấp giải pháp tổng quát hơn, nhưng đã bị trì hoãn. Có vẻ như tình hình hiện tại, trong khi vụng về, không đủ đau đớn để ép buộc thay đổi.

np.isfinite khi được gọi trên vô hướng trả về giá trị loại np.bool_, không phải bool. np.bool_ cũng là loại bạn nhận được khi trích xuất một giá trị vô hướng từ một mảng kiểu bool dtype. Nếu bạn sử dụng np.True_np.False_ thay cho TrueFalse bạn sẽ nhận được hành vi nhất quán theo ~.

+0

Cảm ơn vì lý do giải thích, và đặc biệt là để đề cập đến '&' và '|'. Tôi không biết về những cái đó, và thay vào đó đã sử dụng logical_and và logical_or. –

+0

Tôi đang sử dụng 'numpy' cho các lứa tuổi và cho đến bây giờ không biết mục đích của những cấu trúc dường như được định nghĩa lại nhưng được gạch chân như' np.False_'. Điều này tất cả có ý nghĩa bây giờ – dashesy

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