Numpy jest „prawda” to nie to samo „prawdziwe” jak Pythona „prawdziwy” i do nich is
zawiedzie:
>>> 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'>
Również specjalnie PEP 8 mówi DONT stosowanie „jest” lub „==” dla wartości logiczne:
Don't compare boolean values to True or False using ==:
Yes: if greeting:
No: if greeting == True:
Worse: if greeting is True:
pusta tablica numpy robi testy falsey tak pustej listy Python lub pusty dict robi:
>>> [bool(x) for x in [[],{},np.array([])]]
[False, False, False]
przeciwieństwie do Pythona, a numpy tablicy pojedynczego falsey elementu robi testy falsey:
>>> [bool(x) for x in [[False],[0],{0:False},np.array([False]), np.array([0])]]
[True, True, True, False, False]
Ale nie można używać tej logiki z numpy tablicy z więcej niż jednego elementu:
>>> 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()
więc " duch”PEP 8 z numPy jest prawdopodobnie tylko przetestować każdy element jest truthiness:
>>> np.where(np.array([0,0]))
(array([], dtype=int64),)
>>> np.where(np.array([0,1]))
(array([1]),)
lub użyj any
:
>>> np.array([0,0]).any()
False
>>> np.array([0,1]).any()
True
i zdawać sobie sprawę, że to nie jest to, czego można się spodziewać:
>>> bool(np.where(np.array([0,0])))
True
Od np.where
wraca krotki niepusty.
Gdzie można znaleźć ten PEP8 E712? – mgilson
To jest specyficzne wyjście diagnostyczne za pomocą narzędzia "pep8": https://github.com/jcrocholl/pep8/blob/master/pep8.py#L900. Zauważ, że w tym przypadku jest źle, ponieważ 'a jest True' nie ma znaczenia dla tablicy. – nneonneo
@mgilson Możesz również wyszukać python 'linter'. Większość/niektóre IDE mają wtyczki do sprawdzania twojego kodu przez pep8. – Framester