2012-11-28 14 views
25

एक साधारण सवाल होना चाहिए, लेकिन मुझे कहीं भी जवाब नहीं मिल रहा है। पाइथन में ~ ऑपरेटर को बिटवाईव इनवर्जन ऑपरेटर के रूप में प्रलेखित किया गया है। ठीक। मैं उचित रूप में सिज़ोफ्रेनिया व्यवहार पर ध्यान दिया है, हालांकि, बुद्धि के लिए:पायथन टिल्ड यूनरी ऑपरेटर अस्वीकरण numpy bool array

~True -> -2 
~1 -> -2 
~False -> -1 
~0 -> -1 
~numpy.array([True,False],dtype=int) -> array([-2,-1]) 
~numpy.array([True,False],dtype=bool) -> array([False,True]) 

पहले 4 उदाहरण में, मैं भले ही यह बूलियन है कि अजगर लागू कर रहा है (के रूप में दस्तावेज) देख सकते हैं ~x = -(x+1), इनपुट एक पूर्णांक के रूप में इलाज के साथ । इसलिए, एक स्केलर बूलियन के लिए, ~ को तार्किक अस्वीकृति के रूप में नहीं माना जाता है। यह नहीं कि व्यवहार एक int प्रकार के साथ बुलियन मूल्यों के साथ परिभाषित एक numpy सरणी पर समान है।

~ क्यों एक बूलियन सरणी पर लॉजिकल अस्वीकरण ऑपरेटर के रूप में काम करता है (यह भी ध्यान दें: ~numpy.isfinite(numpy.inf) -> True?)?

यह बेहद परेशान है कि मुझे not() को स्केलर पर उपयोग करना होगा, लेकिन not() किसी सरणी को अस्वीकार करने के लिए काम नहीं करेगा। फिर एक सरणी के लिए, मैं ~ का उपयोग करना चाहिए, लेकिन ~ एक अदिश नकारना करने के लिए काम नहीं करेगा ... इसलिए यह कर सकते हैं '

उत्तर

26

not, __nonzero__ विशेष विधि, जो या तो True या False वापस जाने के लिए आवश्यक है के माध्यम से कार्यान्वित किया जाता है आवश्यक परिणाम नहीं देते हैं। इसके बजाय ~ ऑपरेटर का उपयोग किया जाता है, जिसे __not__ विशेष विधि के माध्यम से कार्यान्वित किया जाता है। इसी कारण से, & और |and और or के स्थान पर उपयोग किया जाता है।

PEP 335 का उद्देश्य बुलियन ऑपरेटर को ओवरलोड करने की अनुमति देना था, लेकिन अत्यधिक ओवरहेड के कारण इसे अस्वीकार कर दिया गया था (यह उदास होगा if कथन)। PEP 225 "elementwise" ऑपरेटरों के लिए एक सामान्य वाक्यविन्यास सुझाता है, जो एक अधिक सामान्य समाधान प्रदान करेगा, लेकिन स्थगित कर दिया गया है। ऐसा प्रतीत होता है कि वर्तमान स्थिति, जबकि अजीब, परिवर्तन को मजबूर करने के लिए पर्याप्त दर्दनाक नहीं है।

np.isfinite जब स्केलर पर कॉल किया जाता है तो np.bool_ प्रकार का मान देता है, bool नहीं। np.bool_ भी वह प्रकार है जो आपको बूल डाइप के सरणी से स्केलर मान निकालने के दौरान मिलता है। यदि आप True और False के स्थान पर np.True_ और np.False_ का उपयोग करते हैं तो ~ के तहत आपको लगातार व्यवहार मिल जाएगा।

+0

स्पष्टीकरण के लिए धन्यवाद और विशेष रूप से '&' और '|' का उल्लेख करने के लिए धन्यवाद। मैं उन लोगों के बारे में नहीं जानता था, और इसके बजाय logical_and और logical_or का उपयोग किया था। –

+0

मैं उम्र के लिए 'numpy' का उपयोग कर रहा हूं और अब तक उन लोगों के उद्देश्य को नहीं जानता था जो 'np.False_'' जैसी प्रतीत होती है। यह सब अब समझ में आता है – dashesy