2012-05-21 14 views
6

में एक numpy सरणी में हैं या नहीं, मैं यह जांचना चाहता हूं कि एक NumPyArray में सेट में मौजूद मान हैं, और यदि ऐसा है तो उस क्षेत्र को सरणी में सेट करें = 1. यदि कोई KeepRaster सेट नहीं है = 2.जांचें कि सेट में मान पाइथन

numpyArray = #some imported array 
repeatSet= ([3, 5, 6, 8]) 

confusedRaster = numpyArray[numpy.where(numpyArray in repeatSet)]= 1 

पैदावार:

<type 'exceptions.TypeError'>: unhashable type: 'numpy.ndarray' 

इसमें लूप करने के लिए कोई तरीका है?

for numpyArray 
     if numpyArray in repeatSet 
      confusedRaster = 1 
     else 
      keepRaster = 2 

स्पष्ट और थोड़ा आगे मदद के लिए पूछना करने के लिए:

क्या मैं, पर पाने के लिए कोशिश कर रहा हूँ, और वर्तमान में कर रहा हूँ एक सरणी में एक रेखापुंज इनपुट रहा है। मुझे 2-डी सरणी में मान पढ़ने और उन मानों के आधार पर एक और सरणी बनाने की आवश्यकता है। यदि सरणी मान एक सेट में है तो मान 1 होगा। यदि यह किसी सेट में नहीं है तो मान किसी अन्य इनपुट से लिया जाएगा, लेकिन अब मैं 77 कहूंगा। यह वही है जो मैं वर्तमान में उपयोग कर रहा हूं। मेरे परीक्षण इनपुट में लगभग 1500 पंक्तियां और 3500 कॉलम हैं। यह हमेशा पंक्ति के आसपास स्थिर हो 350.

for rowd in range(0, width): 
    for cold in range (0, height): 
     if numpyarray.item(rowd,cold) in repeatSet: 
      confusedArray[rowd][cold] = 1 
     else: 
      if numpyarray.item(rowd,cold) == 0: 
       confusedArray[rowd][cold] = 0 
      else: 
       confusedArray[rowd][cold] = 2 

उत्तर

12

संस्करणों 1.4 और उच्चतर में, numpy in1d समारोह प्रदान करता है।

>>> test = np.array([0, 1, 2, 5, 0]) 
>>> states = [0, 2] 
>>> np.in1d(test, states) 
array([ True, False, True, False, True], dtype=bool) 

आप इसे असाइनमेंट के लिए मास्क के रूप में उपयोग कर सकते हैं।

>>> test[np.in1d(test, states)] = 1 
>>> test 
array([1, 1, 1, 5, 1]) 

यहाँ numpy के अनुक्रमण और असाइनमेंट वाक्य रचना के कुछ और अधिक परिष्कृत का उपयोग करता है मुझे लगता है कि आपकी समस्या के लिए लागू होगी रहे हैं। नोट बिटवाइज़ ऑपरेटर्स के उपयोग if आधारित तर्क को बदलने के लिए:

>>> numpy_array = numpy.arange(9).reshape((3, 3)) 
>>> confused_array = numpy.arange(9).reshape((3, 3)) % 2 
>>> mask = numpy.in1d(numpy_array, repeat_set).reshape(numpy_array.shape) 
>>> mask 
array([[False, False, False], 
     [ True, False, True], 
     [ True, False, True]], dtype=bool) 
>>> ~mask 
array([[ True, True, True], 
     [False, True, False], 
     [False, True, False]], dtype=bool) 
>>> numpy_array == 0 
array([[ True, False, False], 
     [False, False, False], 
     [False, False, False]], dtype=bool) 
>>> numpy_array != 0 
array([[False, True, True], 
     [ True, True, True], 
     [ True, True, True]], dtype=bool) 
>>> confused_array[mask] = 1 
>>> confused_array[~mask & (numpy_array == 0)] = 0 
>>> confused_array[~mask & (numpy_array != 0)] = 2 
>>> confused_array 
array([[0, 2, 2], 
     [1, 2, 1], 
     [1, 2, 1]]) 

एक और दृष्टिकोण से numpy.where है, जो एक ब्रांड नई सरणी बनाता है, दूसरा तर्क जहां mask सच है मानों का उपयोग करके, और मूल्यों का उपयोग किया जाएगा तीसरा तर्क जहां mask गलत है। (काम के साथ के रूप में, तर्क एक अदिश या mask रूप में एक ही आकार की एक सरणी हो सकता है।) यह थोड़ा अधिक ऊपर से कुशल हो सकता है, और यह निश्चित रूप से अधिक संक्षिप्त है:

>>> numpy.where(mask, 1, numpy.where(numpy_array == 0, 0, 2)) 
array([[0, 2, 2], 
     [1, 2, 1], 
     [1, 2, 1]]) 
+0

हम्म, के रूप में तो मैं वह समझलो। यदि परीक्षण मूल्य सत्य की तुलना में राज्य सूची में है, जो = 1 होगा, अन्यथा यह वही होगा जो यह था। आउटपुट सरणी ([1,0,1,0,0]) – mkmitchell

+0

@mkmitchell बनाने के लिए कोई तरीका है, हाँ, आपको मिल गया। यह सामान्य पाइथन सूचियों के साथ टुकड़ा असाइनमेंट के समान कुछ है, लेकिन ए) numpy की अधिक जटिल अनुक्रमण प्रणाली का उपयोग करता है, और बी) संख्यात्मक सम्मेलन का पालन करता है जो किसी सरणी के टुकड़े को स्केलर निर्दिष्ट करता है, उस स्कालर मान पर स्लाइस में सभी मान निर्दिष्ट करता है। – senderle

+0

अगर यह 2-डी सरणी है तो कैसे? – mkmitchell

1

यहाँ आप क्या whant कर में से एक संभव तरीका है:

numpyArray = np.array([1, 8, 35, 343, 23, 3, 8]) # could be n-Dimensional array 
repeatSet = np.array([3, 5, 6, 8]) 
mask = (numpyArray[...,None] == repeatSet[None,...]).any(axis=-1) 
print mask 
>>> [False True False False False True True] 
संबंधित मुद्दे