7

PEP8 E712「との比較はorTrueである必要があります」。if cond is True:if cond:

しかし、これに従うPEP8と、異なる/間違った結果が得られます。なんで?

In [1]: from pylab import *

In [2]: a = array([True, True, False])

In [3]: where(a == True)
Out[3]: (array([0, 1]),)
# correct results with PEP violation

In [4]: where(a is True)
Out[4]: (array([], dtype=int64),)
# wrong results without PEP violation

In [5]: where(a)
Out[5]: (array([0, 1]),)
# correct results without PEP violation, but not as clear as the first two imho. "Where what?"
4

2 に答える 2

10

Numpy の 'True' は Python の 'True' と同じ 'True' ではないため、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 と同じように falsey をテストします。

>>> [bool(x) for x in [[],{},np.array([])]]
[False, False, False] 

Python とは異なり、単一の falsey 要素の numpy 配列は falsey をテストします。

>>> [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()

したがって、Numpy を使用した PEP 8 の「精神」は、おそらく各要素の真実性のみをテストすることです。

>>> 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空でないタプルを返すので。

于 2013-03-01T19:00:04.677 に答える
3

ifこのアドバイスは、値の「真実性」をテストするステートメントにのみ適用されます。numpy別の獣です。

>>> a = np.array([True, False]) 
>>> a == True
array([ True, False], dtype=bool)
>>> a is True
False

a is Trueはブール値ではなく配列であり、単純な参照等価性テストを実行するためです(Falseたとえば、;のみ)。aisTrue is TrueNone is not True

于 2013-03-01T18:55:40.137 に答える