2013-03-01 11 views
6

PEP8 E712 की आवश्यकता है कि "True की तुलना if cond is True: या if cond: होनी चाहिए"।बूलियन numpy arrays के साथ तुलना वीएस PEP8 E712

लेकिन अगर मैं इस 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?" 
+0

आप यह पीईपी 8 ई 712 कहां ढूंढ रहे हैं? – mgilson

+2

यह 'pep8' टूल द्वारा एक विशिष्ट नैदानिक ​​आउटपुट है: https://github.com/jcrocholl/pep8/blob/master/pep8.py#L900। ध्यान दें कि इस मामले में यह गलत है क्योंकि 'एक सत्य है' एक सरणी के साथ एक सार्थक बात नहीं है। – nneonneo

+0

@ मिगिलसन आप पाइथन 'लिटर' की खोज भी कर सकते हैं। अधिकांश/कुछ आईडीई में आपके कोड की पेप 8 जांच करने के लिए प्लगइन होते हैं। – Framester

उत्तर

2

यही सलाह केवल एक मूल्य के "truthiness" के लिए if बयान परीक्षण करने के लिए लागू होता है। numpy एक अलग जानवर है।

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

नोट False क्योंकि a एक सरणी, कोई बूलियन नहीं है, और is एक सरल संदर्भ समानता परीक्षण करता है कि a is True हमेशा होता है (ताकि केवल True is True; None is not True उदाहरण के लिए)।

6

Numpy की 'यह सच है' है नहीं के रूप में अजगर की 'यह सच है' और वजह 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'> 

इसके अलावा, विशेष रूप से, पीईपी 8 कहते हैं DONT उपयोग 'है' या '==' के लिए बूलियन्स:

Don't compare boolean values to True or False using ==: 

Yes: if greeting: 
No: if greeting == True: 
Worse: if greeting is True: 

एक खाली numpy सरणी सिर्फ एक खाली अजगर सूची या खाली dict के रूप में परीक्षण falsey करता है:

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

अजगर, एक भी 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() 

तो '

>>> np.where(np.array([0,0])) 
(array([], dtype=int64),) 
>>> np.where(np.array([0,1])) 
(array([1]),) 

या any का उपयोग करें:: Numpy साथ पीईपी 8 की भावना 'शायद ही प्रत्येक तत्व के truthiness परीक्षण करने के लिए है

>>> np.array([0,0]).any() 
False 
>>> np.array([0,1]).any() 
True 

और ध्यान रखें कि यह नहीं है कि आप क्या उम्मीद हो:

>>> bool(np.where(np.array([0,0]))) 
True 

np.where के बाद से एक अरिक्त टपल लौटा रहा है।

संबंधित मुद्दे