2011-12-25 27 views
36

उदाहरण के लिए पर तत्व बुद्धिमान बूलियन कार्रवाई करने मैं एक मुखौटा है कि मास्क 40 और 60 के बीच मूल्य के साथ तत्वों को बनाने के लिए करना चाहते हैं:कैसे NumPy सरणी

foo = np.asanyarray(range(100)) 
mask = (foo < 40).__or__(foo > 60) 

कौन सा सिर्फ बदसूरत लग रहा है, मैं नहीं लिख सकते हैं:

(foo < 40) or (foo > 60) 

क्योंकि मैं के साथ अंत:

ValueError Traceback (most recent call last) 
    ... 
    ----> 1 (foo < 40) or (foo > 60) 
    ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

वहाँ तत्व बुद्धिमान बूलियन ope करने का एक तरीका है विहित अच्छे दिखने वाले कोड के साथ numpy arrays पर राशन?

उत्तर

55

क्या आपने यह कोशिश की है?

mask = (foo < 40) | (foo > 60) 

नोट: एक वस्तु में __or__ विधि बिटवाइज़ या ऑपरेटर (|), नहीं बूलियन or ऑपरेटर overloads।

+1

ओह अच्छा है कि वास्तव में मुझे बेवकूफ था। बेशक यह काम करता है :) –

+0

यह काम नहीं करता है: TypeError: ufunc 'bitwise_or' इनपुट प्रकारों के लिए समर्थित नहीं है, और कास्टिंग नियम 'सुरक्षित' – Mehdi

+4

डॉन के अनुसार इनपुट किसी भी समर्थित प्रकार से सुरक्षित रूप से निष्पादित नहीं किया जा सका अपने अभिव्यक्तियों को सही ढंग से ब्रैकेट करना न भूलें – gota

13

यदि आपके पास केवल बूलियन के भीतर तुलना है, जैसे कि आपके उदाहरण में, आप बिटोवा या ऑपरेटर | का उपयोग जेकोलाडो द्वारा सुझाए गए अनुसार कर सकते हैं। लेकिन सावधान रहें, यदि आप कभी भी गैर-बूलियन का उपयोग करते हैं, जैसे कि mask = (foo < 40) | override का उपयोग करके यह आपको अजीब परिणाम दे सकता है। केवल override या तो गलत, सही, 1, या 0 होने की गारंटी है, तो आप ठीक हैं।

अधिक सामान्य numpy के तुलना सेट ऑपरेटरों, np.any और np.all का उपयोग है। यह टुकड़ा 35 और 45 के बीच सभी मूल्यों रिटर्न जो कम से कम 40 या नहीं 3 की एक बहु हैं:

import numpy as np 
foo = np.arange(35, 46) 
mask = np.any([(foo < 40), (foo % 3)], axis=0) 
print foo[mask] 
OUTPUT: array([35, 36, 37, 38, 39, 40, 41, 43, 44]) 

नहीं के रूप में | साथ के रूप में अच्छा है, लेकिन अपने प्रश्न में कोड की तुलना में अच्छे।

+0

यह एक वैदिक बिंदु है! –

+0

विशेष रूप से 'np.any' और' np.all' का उपयोग करना एक अच्छा विचार है। – htredleaf

1

ध्यान दें कि आप तत्व के निषेध के लिए ~ का उपयोग कर सकते हैं। आप numpy logical operations उपयोग कर सकते हैं

arr = np.array([False, True]) 
~arr 

OUTPUT: array([ True, False], dtype=bool) 

इसके अलावा &और

arr_1 = np.array([False, False, True, True]) 
arr_2 = np.array([False, True, False, True]) 

arr_1 & arr_2 

OUTPUT: array([False, False, False, True], dtype=bool) 

ये भी काम elementwise है साथ पांडा सीरीज

ser_1 = pd.Series([False, False, True, True]) 
ser_2 = pd.Series([False, True, False, True]) 

ser_1 & ser_2 

OUTPUT: 
0 False 
1 False 
2 False 
3  True 
dtype: bool 
+0

numpy दस्तावेज़ीकरण के अनुसार, ऐसा लगता है कि यह '_' 'है [_bitwise_ और] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.bitwise_and.html#numpy.bitwise_and), तत्व के अनुसार नहीं । – HelloGoodbye

5

। अपने उदाहरण में:

np.logical_or (foo < 40, foo> 60)

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