"True" Numpy - это не то же самое "True", что и "True" Python, и поэтому is
терпит неудачу:
>>> 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'>
Кроме того, в частности, PEP 8 говорит НЕ использовать 'is ' или '==' для логических значений:
Don't compare boolean values to True or False using ==:
Yes: if greeting:
No: if greeting == True:
Worse: if greeting is True:
Пустой массив numpy проверяет ложность так же, как пустой список Python или пустой dict:
>>> [bool(x) for x in [[],{},np.array([])]]
[False, False, False]
В отличие от Python, пустой массив из одного ложного элемента проверяет ложность:
>>> [bool(x) for x in [[False],[0],{0:False},np.array([False]), np.array([0])]]
[True, True, True, False, False]
Но вы не можете использовать эту логику с массивом numpy с более чем одним элементом:
>>> 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()
Таким образом, «дух» PEP 8 с Numpy, вероятно, заключается только в проверке правдивости каждого элемента:
>>> np.where(np.array([0,0]))
(array([], dtype=int64),)
>>> np.where(np.array([0,1]))
(array([1]),)
Или используйте any
:
>>> np.array([0,0]).any()
False
>>> np.array([0,1]).any()
True
И имейте в виду, что это не то, что вы ожидаете:
>>> bool(np.where(np.array([0,0])))
True
Так как np.where
возвращает непустой кортеж.
person
dawg
schedule
01.03.2013
pep8
: github.com/jcrocholl. /pep8/blob/master/pep8.py#L900. Обратите внимание, что в данном случае это неправильно, потому чтоa is True
не имеет смысла делать с массивом. - person nneonneo   schedule 01.03.2013linter
. В большинстве/некоторых IDE есть плагины для проверки pep8 вашего кода. - person Framester   schedule 01.03.2013==
. который просто говорит не делайтеif a == True:
- вместо этого делайтеif a:
. Я бы сказал, что в этом случае вашlinter
неверен :) (И я бы рекомендовал подать отчет об ошибке) - person mgilson   schedule 01.03.2013