पंडों में बूलियन अनुक्रमण के लिए तार्किक संचालक


153

मैं पंडों में बूलियन इंडेक्स के साथ काम कर रहा हूं। सवाल यह है कि बयान क्यों है:

a[(a['some_column']==some_number) & (a['some_other_column']==some_other_number)]

जबकि ठीक काम करता है

a[(a['some_column']==some_number) and (a['some_other_column']==some_other_number)]

त्रुटि के साथ बाहर निकलता है

उदाहरण:

a=pd.DataFrame({'x':[1,1],'y':[10,20]})

In: a[(a['x']==1)&(a['y']==10)]
Out:    x   y
     0  1  10

In: a[(a['x']==1) and (a['y']==10)]
Out: ValueError: The truth value of an array with more than one element is ambiguous.     Use a.any() or a.all()

6
इसका कारण यह है कि numpy arrays और पांडा श्रृंखला तार्किक के बजाय बिटवाइज़ ऑपरेटरों का उपयोग करते हैं क्योंकि आप सरणी / श्रृंखला के प्रत्येक तत्व की दूसरे के साथ तुलना कर रहे हैं। इसलिए इस स्थिति में तार्किक ऑपरेटर का उपयोग करने का कोई मतलब नहीं है। संबंधित देखें: stackoverflow.com/questions/8632033/…
EdChum

9
पायथन में and != &andअजगर में ऑपरेटर ओवरराइड नहीं किया जा सकता है, जबकि &ऑपरेटर ( __and__) कर सकते हैं। इसलिए पसंद &नापसंद और पांडा में उपयोग ।
स्टीवन रूंबाल्की

जवाबों:


209

जब आप कहें

(a['x']==1) and (a['y']==10)

आप परोक्ष परिवर्तित करने के लिए अजगर पूछ रहे हैं (a['x']==1)और (a['y']==10)बूलियन मूल्यों के लिए।

NumPy सरणियों (लंबाई 1 से अधिक) और पंडों की वस्तुओं जैसे कि श्रृंखला का बूलियन मूल्य नहीं है - दूसरे शब्दों में, वे उठाते हैं

ValueError: The truth value of an array is ambiguous. Use a.empty, a.any() or a.all().

जब एक बूलियन मान के रूप में उपयोग किया जाता है। ऐसा इसलिए है क्योंकि यह स्पष्ट नहीं है कि यह कब सही या गलत होना चाहिए । कुछ उपयोगकर्ता मान सकते हैं कि वे सत्य हैं यदि उनके पास गैर-शून्य लंबाई है, जैसे पायथन सूची। दूसरे इसके लिए इच्छा कर सकते हैं कि यह तभी सत्य हो जब इसके सभी तत्व सत्य हों। दूसरों को यह सच हो सकता है अगर कोई हो सकता है इसका तत्व सत्य है।

क्योंकि बहुत सारी परस्पर विरोधी अपेक्षाएँ हैं, NumPy और Pandas के डिज़ाइनर अनुमान लगाने से इनकार करते हैं, और इसके बजाय एक ValueError बढ़ाते हैं।

इसके बजाय, आपको empty(), all()या को कॉल करके , स्पष्ट होना चाहिएany() संकेत मिलता है जो व्यवहार आप की इच्छा विधि।

इस मामले में, हालांकि, ऐसा लगता है कि आप बूलियन मूल्यांकन नहीं चाहते हैं, आप तत्व-वार तार्किक-और चाहते हैं। यही &बाइनरी ऑपरेटर करता है:

(a['x']==1) & (a['y']==10)

एक बूलियन सरणी देता है।


वैसे, alexpmil नोट के रूप में , कोष्ठक अनिवार्य हैं क्योंकि &इसकी तुलना में एक उच्च ऑपरेटर पूर्वता है ==। कोष्ठक के बिना, a['x']==1 & a['y']==10मूल्यांकन किया a['x'] == (1 & a['y']) == 10जाएगा जो बदले में जंजीर तुलना के बराबर होगा (a['x'] == (1 & a['y'])) and ((1 & a['y']) == 10)। वह रूप की अभिव्यक्ति है Series and Seriesandदो श्रृंखलाओं के उपयोग से फिर से वही शुरू होगाValueError ऊपर जैसा । इसलिए कोष्ठक अनिवार्य हैं।


3
यदि उनकी लंबाई एक है, तो खसखस ​​में यह गुण होता है । केवल पांडा देवों (हठी) ने अनुमान लगाने से इंकार कर दिया: पी
एंडी हेडन

4
क्या 'और' उसी अस्पष्ट वक्र को 'और' के रूप में नहीं ले जाता है? जब यह 'और' की बात आती है, तो अचानक सभी उपयोगकर्ता सहमत होते हैं कि यह तत्व-वार होना चाहिए, जबकि जब वे 'और' देखते हैं, तो उनकी अपेक्षाएँ भिन्न होती हैं?
इंडोमिनस

16
@Indominus: पायथन भाषा को स्वयं यह आवश्यकता है कि अभिव्यक्ति x and yके मूल्यांकन को ट्रिगर करता है bool(x)और bool(y)। पायथन "पहले मूल्यांकन करता है x; यदि xगलत है, तो इसका मूल्य वापस आ गया है; अन्यथा, yमूल्यांकन किया जाता है और परिणामी मूल्य वापस लौटाया जाता है।" तो सिंटैक्स का x and yउपयोग एलिमेंट-वेजेड लॉजिकल-के लिए नहीं किया जा सकता है और केवल xया yवापस किया जा सकता है। इसके विपरीत, x & yट्रिगर्स x.__and__(y)और __and__विधि को हमारी पसंद के किसी भी चीज़ को वापस करने के लिए परिभाषित किया जा सकता है।
22

2
नोट करने के लिए महत्वपूर्ण: ==खंड के चारों ओर कोष्ठक अनिवार्य हैंa['x']==1 & a['y']==10प्रश्न में उसी त्रुटि को देता है।
एलेक्स पी। मिलर

1
के लिए "|" क्या है?
Euler_Salter

62

TLDR; पंडों में तार्किक संचालक हैं &, |और ~, और कोष्ठक (...)महत्वपूर्ण है!

अजगर है and, orऔर notतार्किक ऑपरेटरों scalars साथ काम करने के लिए डिजाइन किए हैं। इसलिए पंडों को एक बेहतर काम करना था और वेक्टरवाइज हासिल करने के लिए बिटवाइज ऑपरेटर्स को ओवरराइड करना था इस कार्यप्रणाली के (तत्व-वार) संस्करण ।

तो अजगर में निम्नलिखित ( exp1और exp2भाव हैं जो एक बूलियन परिणाम का मूल्यांकन करते हैं) ...

exp1 and exp2              # Logical AND
exp1 or exp2               # Logical OR
not exp1                   # Logical NOT

... का अनुवाद होगा ...

exp1 & exp2                # Element-wise logical AND
exp1 | exp2                # Element-wise logical OR
~exp1                      # Element-wise logical NOT

पांडा के लिए।

यदि आप तार्किक ऑपरेशन करने की प्रक्रिया में हैं ValueError, तो आपको समूहन के लिए कोष्ठक का उपयोग करने की आवश्यकता है:

(exp1) op (exp2)

उदाहरण के लिए,

(df['col1'] == x) & (df['col2'] == y) 

और इसी तरह।


बूलियन इंडेक्सिंग : एक सामान्य ऑपरेशन डेटा को फ़िल्टर करने के लिए तार्किक स्थितियों के माध्यम से बूलियन मास्क की गणना करना है। पंडों ने तीन ऑपरेटरों कोप्रदान किया:&तार्किक के|लिए,तार्किक के लिए, और~ तार्किक नहीं के लिए।

निम्नलिखित सेटअप पर विचार करें:

np.random.seed(0)
df = pd.DataFrame(np.random.choice(10, (5, 3)), columns=list('ABC'))
df

   A  B  C
0  5  0  3
1  3  7  9
2  3  5  2
3  4  7  6
4  8  8  1

तार्किक और

के लिए dfऊपर, तुम कहाँ एक <5 और B> 5. यह कंप्यूटिंग प्रत्येक शर्त के लिए मास्क अलग है, और उन्हें Anding द्वारा किया जाता है सभी पंक्तियों को वापस करना चाहते हैं का कहना है।

ओवरलोडेड बिटकॉइन &ऑपरेटर
जारी रखने से पहले, डॉक्स के इस विशेष अंश पर ध्यान दें

एक और आम ऑपरेशन बूलियन वैक्टर का उपयोग डेटा को फ़िल्टर करने के लिए है। ऑपरेटरों हैं: |के लिए or, &के लिए and, और ~के लिए notइन कोष्ठकों का उपयोग के आधार पर वर्गीकृत किया जाना चाहिए , डिफ़ॉल्ट अजगर द्वारा के बाद से इस तरह के रूप एक अभिव्यक्ति का मूल्यांकन करेंगे df.A > 2 & df.B < 3के रूप में df.A > (2 & df.B) < 3है, जबकि वांछित मूल्यांकन आदेश है (df.A > 2) & (df.B < 3)

इसलिए, इसे ध्यान में रखते हुए, तत्व बुद्धिमान तार्किक और बिटवाइज़ ऑपरेटर के साथ कार्यान्वित किया जा सकता है &:

df['A'] < 5

0    False
1     True
2     True
3     True
4    False
Name: A, dtype: bool

df['B'] > 5

0    False
1     True
2    False
3     True
4     True
Name: B, dtype: bool

(df['A'] < 5) & (df['B'] > 5)

0    False
1     True
2    False
3     True
4    False
dtype: bool

और बाद में छानने का कदम बस है,

df[(df['A'] < 5) & (df['B'] > 5)]

   A  B  C
1  3  7  9
3  4  7  6

कोष्ठक संचालकों के डिफ़ॉल्ट पूर्वता क्रम को ओवरराइड करने के लिए कोष्ठक का उपयोग किया जाता है, जो सशर्त संचालकों पर उच्च पूर्वता रखते हैं <और >। अजगर डॉक्स में ऑपरेटर पूर्वता का अनुभाग देखें ।

यदि आप कोष्ठक का उपयोग नहीं करते हैं, तो अभिव्यक्ति का गलत तरीके से मूल्यांकन किया जाता है। उदाहरण के लिए, यदि आप गलती से ऐसा कुछ करने का प्रयास करते हैं

df['A'] < 5 & df['B'] > 5

इसे पार्स किया गया है

df['A'] < (5 & df['B']) > 5

जो बन जाता है,

df['A'] < something_you_dont_want > 5

जो हो जाता है ( जंजीर ऑपरेटर तुलना पर अजगर डॉक्स देखें ),

(df['A'] < something_you_dont_want) and (something_you_dont_want > 5)

जो बन जाता है,

# Both operands are Series...
something_else_you_dont_want1 and something_else_you_dont_want2

जो फेंकता है

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

तो, वह गलती मत करो! 1

कोष्ठक से बचना समूह
निर्धारण वास्तव में काफी सरल है। अधिकांश ऑपरेटरों के पास डाटाफ्रेम के लिए एक समान बाध्य विधि है। यदि सशर्त संचालकों के बजाय कार्यों का उपयोग करके व्यक्तिगत मुखौटे बनाए जाते हैं, तो आपको मूल्यांकन आदेश निर्दिष्ट करने के लिए परेंस द्वारा समूह की आवश्यकता नहीं होगी:

df['A'].lt(5)

0     True
1     True
2     True
3     True
4    False
Name: A, dtype: bool

df['B'].gt(5)

0    False
1     True
2    False
3     True
4     True
Name: B, dtype: bool

df['A'].lt(5) & df['B'].gt(5)

0    False
1     True
2    False
3     True
4    False
dtype: bool

लचीली तुलना पर अनुभाग देखें । संक्षेप में, हमारे पास है

╒════╤════════════╤════════════╕
     Operator    Function   
╞════╪════════════╪════════════╡
  0  >           gt         
├────┼────────────┼────────────┤
  1  >=          ge         
├────┼────────────┼────────────┤
  2  <           lt         
├────┼────────────┼────────────┤
  3  <=          le         
├────┼────────────┼────────────┤
  4  ==          eq         
├────┼────────────┼────────────┤
  5  !=          ne         
╘════╧════════════╧════════════╛

कोष्ठक से बचने का एक अन्य विकल्प उपयोग DataFrame.query(या eval) है:

df.query('A < 5 and B > 5')

   A  B  C
1  3  7  9
3  4  7  6

मैं है बड़े पैमाने पर दस्तावेज queryऔर evalमें pd.eval का उपयोग कर गतिशील अभिव्यक्ति मूल्यांकन पांडा में ()

operator.and_
आपको इस कार्य को कार्यात्मक तरीके से करने की अनुमति देता है। आंतरिक रूप से कॉल Series.__and__जो बिटवाइज़ ऑपरेटर से मेल खाती है।

import operator 

operator.and_(df['A'] < 5, df['B'] > 5)
# Same as,
# (df['A'] < 5).__and__(df['B'] > 5) 

0    False
1     True
2    False
3     True
4    False
dtype: bool

df[operator.and_(df['A'] < 5, df['B'] > 5)]

   A  B  C
1  3  7  9
3  4  7  6

आपको आमतौर पर इसकी आवश्यकता नहीं होगी, लेकिन यह जानना उपयोगी है।

सामान्यीकरण: np.logical_and(और logical_and.reduce)
एक अन्य विकल्प का उपयोग किया जा रहा है np.logical_and, जिसके लिए कोष्ठक के समूहीकरण की आवश्यकता नहीं है:

np.logical_and(df['A'] < 5, df['B'] > 5)

0    False
1     True
2    False
3     True
4    False
Name: A, dtype: bool

df[np.logical_and(df['A'] < 5, df['B'] > 5)]

   A  B  C
1  3  7  9
3  4  7  6

np.logical_andएक ufunc (यूनिवर्सल फ़ंक्शंस) है , और अधिकांश ufuncs में एक reduceविधि है। इसका मतलब यह है कि logical_andअगर आपके पास कई मास्क हैं तो इसे सामान्य करना आसान है । उदाहरण के लिए, करने के लिए और मास्क m1और m2और m3साथ &, तुम क्या करने के लिए होता है

m1 & m2 & m3

हालाँकि, एक आसान विकल्प है

np.logical_and.reduce([m1, m2, m3])

यह शक्तिशाली है, क्योंकि यह आपको अधिक जटिल तर्क के साथ इसके ऊपर निर्माण करने देता है (उदाहरण के लिए, गतिशील रूप से सूची समझ में मास्क उत्पन्न करना और उन सभी को जोड़ना):

import operator

cols = ['A', 'B']
ops = [np.less, np.greater]
values = [5, 5]

m = np.logical_and.reduce([op(df[c], v) for op, c, v in zip(ops, cols, values)])
m 
# array([False,  True, False,  True, False])

df[m]
   A  B  C
1  3  7  9
3  4  7  6

1 - मुझे पता है कि मैं इस बिंदु पर नुकसान पहुंचा रहा हूं, लेकिन कृपया मेरे साथ सहन करें। यह है एक बहुत , बहुत आम शुरुआत की गलती है, और बहुत अच्छी तरह से समझाया जाना चाहिए।


तार्किक या

के लिए dfऊपर, आप सभी पंक्तियों जहां एक == 3 या बी == 7 वापस आना चाहते हैं।

ओवरलोड बिट |

df['A'] == 3

0    False
1     True
2     True
3    False
4    False
Name: A, dtype: bool

df['B'] == 7

0    False
1     True
2    False
3     True
4    False
Name: B, dtype: bool

(df['A'] == 3) | (df['B'] == 7)

0    False
1     True
2     True
3     True
4    False
dtype: bool

df[(df['A'] == 3) | (df['B'] == 7)]

   A  B  C
1  3  7  9
2  3  5  2
3  4  7  6

यदि आपने अभी तक नहीं किया है, तो कृपया तार्किक और पर अनुभाग भी पढ़ें ऊपर दिए , सभी कैविएट यहां लागू होते हैं।

वैकल्पिक रूप से, इस ऑपरेशन के साथ निर्दिष्ट किया जा सकता है

df[df['A'].eq(3) | df['B'].eq(7)]

   A  B  C
1  3  7  9
2  3  5  2
3  4  7  6

operator.or_
Series.__or__हुड के तहत कॉल ।

operator.or_(df['A'] == 3, df['B'] == 7)
# Same as,
# (df['A'] == 3).__or__(df['B'] == 7)

0    False
1     True
2     True
3     True
4    False
dtype: bool

df[operator.or_(df['A'] == 3, df['B'] == 7)]

   A  B  C
1  3  7  9
2  3  5  2
3  4  7  6

np.logical_or
दो शर्तों के लिए, का उपयोग करें logical_or :

np.logical_or(df['A'] == 3, df['B'] == 7)

0    False
1     True
2     True
3     True
4    False
Name: A, dtype: bool

df[np.logical_or(df['A'] == 3, df['B'] == 7)]

   A  B  C
1  3  7  9
2  3  5  2
3  4  7  6

कई मास्क के लिए, उपयोग करें logical_or.reduce:

np.logical_or.reduce([df['A'] == 3, df['B'] == 7])
# array([False,  True,  True,  True, False])

df[np.logical_or.reduce([df['A'] == 3, df['B'] == 7])]

   A  B  C
1  3  7  9
2  3  5  2
3  4  7  6

तार्किक नहीं

एक मुखौटा दिया, जैसे कि

mask = pd.Series([True, True, False])

यदि आपको प्रत्येक बूलियन मान को उल्टा करने की आवश्यकता है (ताकि अंतिम परिणाम हो [False, False, True] ), तो आप नीचे दिए गए किसी भी तरीके का उपयोग कर सकते हैं।

बिटवाइज़ ~

~mask

0    False
1    False
2     True
dtype: bool

फिर से, भावों को छोटा किया जाना चाहिए।

~(df['A'] == 3)

0     True
1    False
2    False
3     True
4     True
Name: A, dtype: bool

यह आंतरिक रूप से कहता है

mask.__invert__()

0    False
1    False
2     True
dtype: bool

लेकिन इसे सीधे उपयोग न करें।

operator.inv
आंतरिक रूप __invert__से श्रृंखला पर कॉल करता है।

operator.inv(mask)

0    False
1    False
2     True
dtype: bool

np.logical_not
यह संख्यात्मक संस्करण है।

np.logical_not(mask)

0    False
1    False
2     True
dtype: bool

ध्यान दें, np.logical_andके लिए प्रतिस्थापित किया जा सकता np.bitwise_and, logical_orके साथ bitwise_or, और logical_notसाथ invert


@ टीएलडीआर में सीएस 95, तत्व-वार बूलियन के लिए या, आप का उपयोग करने की वकालत करते हैं |, जो numpy.bitwise_orइसके बजाय इसके बराबर है numpy.logical_or। मैं पूछ सकता हूँ क्यों? numpy.logical_orइस कार्य के लिए विशेष रूप से डिज़ाइन नहीं किया गया है? प्रत्येक जोड़ी तत्वों के लिए इसे बिटवाइज़ करने का भार क्यों जोड़ें?
flow2k

@ flow2k आप प्रासंगिक पाठ को उद्धृत कर सकते हैं कृपया? मुझे पता नहीं है कि आप किस बारे में बात कर रहे हैं। FWIW मैं यह बताता हूं कि तार्किक_ * ऑपरेटरों के लिए सही कार्यात्मक समकक्ष है।
cs95

@ cs95 मैं उत्तर की पहली पंक्ति का उल्लेख कर रहा हूं: "TLDR; पंडों में तार्किक संचालक &,; & ~" हैं।
flow2k 21

@ flow2k यह वस्तुतः प्रलेखन में है : "डेटा को फ़िल्टर करने के लिए एक और सामान्य ऑपरेशन बूलियन वैक्टर का उपयोग है। ऑपरेटर हैं:: के लिए, या और, और ~ के लिए नहीं।"
cs95

@ सीएस 95, ठीक है, मैं अभी इस अनुभाग को पढ़ता हूं, और यह |तत्व-वार बूलियन ऑपरेशन के लिए उपयोग करता है । लेकिन मेरे लिए, वह दस्तावेज एक "ट्यूटोरियल" से अधिक है, और इसके विपरीत, मुझे लगता है कि ये एपीआई संदर्भ सत्य के स्रोत के करीब हैं: numpy.bitwise_or और numpy.logical_or - इसलिए मैं यह समझने की कोशिश कर रहा हूं कि क्या यहाँ वर्णित है।
flow2k

4

पंडों में बूलियन अनुक्रमण के लिए तार्किक संचालक

यह एहसास है कि आप अजगर के किसी भी उपयोग नहीं कर सकते महत्वपूर्ण है तार्किक ऑपरेटरों ( and, orया notपर) pandas.Seriesया pandas.DataFrameरों (इसी तरह आप पर उनका उपयोग नहीं कर सकते हैं numpy.arrayएक से अधिक तत्व के साथ रों)। कारण यह है कि आप उन का उपयोग नहीं कर सकते हैं क्योंकि वे स्पष्ट रूप boolसे अपने ऑपरेंड पर कॉल करते हैं जो एक अपवाद फेंकता है क्योंकि इन डेटा संरचनाओं ने फैसला किया कि एक सरणी का बूलियन अस्पष्ट है:

>>> import numpy as np
>>> import pandas as pd
>>> arr = np.array([1,2,3])
>>> s = pd.Series([1,2,3])
>>> df = pd.DataFrame([1,2,3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> bool(s)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> bool(df)
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

मैंने अपने उत्तर में इसे अधिक विस्तार से कवर किया "श्रृंखला का सत्य मूल्य अस्पष्ट है। a.empty, a.bool (), a.item (), a.any () या a.all ()" Q का उपयोग करें + A

NumPys तार्किक कार्य करता है

हालांकि NumPy कार्यों के रूप में इन ऑपरेटरों उस पर इस्तेमाल किया जा सकता करने के लिए तत्व के लिहाज से ऑपरेटिंग समकक्ष प्रदान करता है numpy.array, pandas.Series, pandas.DataFrame, या किसी अन्य (अनुरूप) numpy.arrayउपवर्ग:

तो, अनिवार्य रूप से, एक का उपयोग करना चाहिए (मान रहे हैं df1और df2पांडा हैं डेटाफ्रेम):

np.logical_and(df1, df2)
np.logical_or(df1, df2)
np.logical_not(df1)
np.logical_xor(df1, df2)

बूलियंस के लिए बिटवाइज़ फ़ंक्शंस और बिटवाइज़ ऑपरेटर

हालाँकि, यदि आपके पास बूलियन न्यूपी सरणी, पांडा श्रृंखला या पांडा डेटा है तो आप तत्व-वार बिटवाइज़ फ़ंक्शंस का उपयोग भी कर सकते हैं ( बूलियन वे हैं - या कम से कम होना चाहिए - तार्किक कार्यों से अप्रभेद्य):

  • बिट वाइज और: np.bitwise_andया& ऑपरेटर
  • बिटवाइज़ या: np.bitwise_orया द| ऑपरेटर
  • बिटवाइज़ न: np.invert(या उपनाम np.bitwise_not) या ~ऑपरेटर
  • बिट वाइज xor: np.bitwise_xorया ^ऑपरेटर

आमतौर पर ऑपरेटरों का उपयोग किया जाता है। जब तुलना संचालकों के साथ संयुक्त होता है तो किसी को कोष्ठक में तुलना लपेटना याद रखना पड़ता है क्योंकि बिटकॉइन संचालकों की तुलना संचालकों से अधिक होती है :

(df1 < 10) | (df2 > 10)  # instead of the wrong df1 < 10 | df2 > 10

यह परेशान करने वाला हो सकता है क्योंकि पायथन लॉजिकल ऑपरेटर्स की तुलना ऑपरेटरों से कम होती है, इसलिए आप सामान्य रूप से लिखते हैं a < 10 and b > 10(जहां aऔरb उदाहरण सरल पूर्णांकों के लिए कर रहे हैं) और कोष्ठक जरूरत नहीं है।

तार्किक और बिटवाइज़ ऑपरेशन के बीच अंतर (गैर-बूलियन पर)

यह वास्तव में महत्वपूर्ण है कि बिट और लॉजिकल ऑपरेशंस केवल बूलियन न्यूपी सरणियों (और बूलियन सीरीज और डेटाफ्रेम) के लिए बराबर हैं। यदि इनमें बूलियन नहीं हैं, तो ऑपरेशन अलग परिणाम देगा। मैं NumPy सरणियों का उपयोग करके उदाहरण शामिल करूंगा लेकिन परिणाम पांडा डेटा संरचनाओं के लिए समान होंगे:

>>> import numpy as np
>>> a1 = np.array([0, 0, 1, 1])
>>> a2 = np.array([0, 1, 0, 1])

>>> np.logical_and(a1, a2)
array([False, False, False,  True])
>>> np.bitwise_and(a1, a2)
array([0, 0, 0, 1], dtype=int32)

और चूंकि NumPy (और इसी तरह पांडा) बूलियन ( बूलियन या "मास्क" इंडेक्स एरे ) और पूर्णांक ( इंडेक्स एरे ) के लिए अलग-अलग चीजें करता है , इसलिए इंडेक्सिंग के परिणाम भी अलग-अलग होंगे:

>>> a3 = np.array([1, 2, 3, 4])

>>> a3[np.logical_and(a1, a2)]
array([4])
>>> a3[np.bitwise_and(a1, a2)]
array([1, 1, 1, 2])

सारांश तालिका

Logical operator | NumPy logical function | NumPy bitwise function | Bitwise operator
-------------------------------------------------------------------------------------
       and       |  np.logical_and        | np.bitwise_and         |        &
-------------------------------------------------------------------------------------
       or        |  np.logical_or         | np.bitwise_or          |        |
-------------------------------------------------------------------------------------
                 |  np.logical_xor        | np.bitwise_xor         |        ^
-------------------------------------------------------------------------------------
       not       |  np.logical_not        | np.invert              |        ~

जहाँ तार्किक ऑपरेटर NumPy सरणियों , पांडा श्रृंखला और पांडा डेटाफ़्रेम के लिए काम नहीं करता है । अन्य लोग इन डेटा संरचनाओं (और सादे पायथन ऑब्जेक्ट्स) पर काम करते हैं और तत्व-वार काम करते हैं। हालाँकि सादे पायथन पर बिटवाइज़ इनवर्ट के साथ सावधान रहें boolक्योंकि बूल को इस संदर्भ में पूर्णांक के रूप में व्याख्या किया जाएगा (उदाहरण के लिए ~Falseरिटर्न -1और ~Trueरिटर्न -2)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.