NumPy của 'True' không giống 'True' như Python của 'True' và do is
thất bại:
>>> import numpy as np
>>> a = np.array([True, True, False])
>>> a[:]
array([ True, True, False], dtype=bool)
>>> a[0]
True
>>> a[0]==True
True
>>> a[0] is True
False
>>> type(a[0])
<type 'numpy.bool_'>
>>> type(True)
<type 'bool'>
Ngoài ra, cụ thể, PEP 8 nói DONT sử dụng 'được' hoặc '==' cho boolean:
Don't compare boolean values to True or False using ==:
Yes: if greeting:
No: if greeting == True:
Worse: if greeting is True:
một mảng numPy trống không kiểm tra falsey cũng giống như một danh sách Python rỗng hoặc dict trống không:
>>> [bool(x) for x in [[],{},np.array([])]]
[False, False, False]
Không giống như Python, một mảng NumPy của một yếu tố falsey duy nhất hiện kiểm tra falsey:
>>> [bool(x) for x in [[False],[0],{0:False},np.array([False]), np.array([0])]]
[True, True, True, False, False]
Nhưng bạn không thể sử dụng logic rằng với một mảng NumPy với nhiều hơn một phần tử:
>>> bool(np.array([0,0]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Vì vậy, các ' tinh thần' của PEP 8 với numPy có lẽ là để chỉ kiểm tra truthiness mỗi phần tử:
>>> np.where(np.array([0,0]))
(array([], dtype=int64),)
>>> np.where(np.array([0,1]))
(array([1]),)
Hoặc sử dụng any
:
>>> np.array([0,0]).any()
False
>>> np.array([0,1]).any()
True
Và lưu ý rằng đây không phải là những gì bạn mong đợi:
>>> bool(np.where(np.array([0,0])))
True
Kể từ np.where
đang trở lại một tuple rỗng.
Bạn đang tìm đâu PEP8 E712 này? – mgilson
Đây là đầu ra chẩn đoán cụ thể bằng công cụ 'pep8': https://github.com/jcrocholl/pep8/blob/master/pep8.py#L900. Lưu ý rằng nó là sai trong trường hợp này bởi vì 'a là True' không phải là một điều có ý nghĩa để làm với một mảng. – nneonneo
@mgilson Bạn cũng có thể tìm kiếm trăn 'linter'. Hầu hết/một số IDE có plugin để kiểm tra pep8 mã của bạn. – Framester