2013-10-23 5 views
11

मेरे पास पूर्णांक की एक सरणी है और यह पता लगाना है कि वह सरणी एकाधिक मानों की सूची में किसी भी मान के बराबर है। यह आसानी से प्रत्येक मान को व्यक्तिगत रूप से या लूप में एकाधिक "या" कथन का उपयोग करके किया जा सकता है, लेकिन मुझे लगता है कि ऐसा करने के लिए एक बेहतर/तेज़ तरीका होना चाहिए। मैं वास्तव में आकार 4000x2000 की सरणियों के साथ काम कर रहा हूँ, लेकिन यहाँ समस्या का एक सरलीकृत संस्करण है:पता लगाएं कि एक numpy सरणी मानों की सूची के किसी भी मूल्य के बराबर है

fake=arange(9).reshape((3,3)) 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]]) 
want=(fake==0)+(fake==2)+(fake==6)+(fake==8) 
print want 
array([[ True, False, True], 
     [False, False, False], 
     [ True, False, True]], dtype=bool) 

क्या मैं चाहते हैं एक तरह से एक भी fake से जुड़े आदेश और मूल्यों [0,2,6,8] की सूची से want प्राप्त करने के लिए है । मैं खुद को कमांड लिख सकता था, लेकिन मुझे लगता है कि एक पैकेज है जिसमें पहले से ही शामिल है जो कि मैंने पाइथन में लूप के साथ एक फ़ंक्शन लिखा है, उससे काफी तेज़ होगा।

धन्यवाद, -Adam

उत्तर

14

समारोह numpy.in1d तुम क्या चाहते हो रहा है। केवल समस्याओं है कि यह केवल 1 दिन सरणियों पर काम करता है है, तो आप इस तरह इसका इस्तेमाल करना चाहिए:

In [9]: np.in1d(fake, [0,2,6,8]).reshape(fake.shape) 
Out[9]: 
array([[ True, False, True], 
     [False, False, False], 
     [ True, False, True]], dtype=bool) 

मैं कोई सुराग नहीं क्यों इस 1d सरणियों ही सीमित है की है। अपने source code को देखते हुए, यह पहली बार दो सरणी को फ़्लैट करने लगता है, जिसके बाद यह कुछ चालाक सॉर्टिंग चाल करता है। लेकिन परिणाम अंत में परिणाम को दोबारा खत्म करने से रोक नहीं पाएगा, जैसे मुझे यहां हाथ से करना था।

+0

हम्म। \t 'डीईएफ़ EqualsAny (ए आर, Vals): \t बाहर = शून्य (ar.shape, dtype = bool) Vals में वैल के लिए \t: \t बाहर + = (ए आर मैं यह काम करने के लिए यह बहुत ही सरल समारोह लिखा था == वैल) \t out' वापसी मैंने सोचा था कि 'numpy.in1d' तेजी से हो सकता है, लेकिन यह वास्तव में (एक ही परिणाम के लिए) समय लेता है: \t' [11] में:% timeit EqualsAny (badlabels, smallnum) \t 1 लूप, 3: 51 9 एमएस प्रति लूप \t में [7]:% timeit ind (badlabels, smallnum) .reshape (badla bels.shape) \t 1 लूप, 3: 871 एमएस प्रति लूप ' सी में लिखे जाने के बाद' numpy.in1d' तेज तरीके से नहीं होना चाहिए? क्या मैं '% timeit' का सही उपयोग नहीं कर रहा हूं? – arwright3

+0

नहीं, 'in1d' सी में लिखा नहीं गया है लेकिन पायथन में, मैंने दिए गए स्रोत कोड का लिंक देखें। यह 'सॉर्ट' जैसे विभिन्न numpy फ़ंक्शंस का उपयोग करता है, जिसे उम्मीद है कि सी में लिखा जाना चाहिए। यहां तक ​​कि 'vals' छोटा होने पर कुछ अनुकूलित एल्गोरिदम भी है, जो आपके समाधान के समान ही है (लेकिन '| =' ' + = ')। मुझे नहीं पता कि आपका संस्करण तेज़ क्यों है, यह दोनों इनपुट की लंबाई पर निर्भर हो सकता है। –

5

@ बेस का उत्तर वह है जिसे आप शायद ढूंढ रहे हैं। लेकिन यहाँ एक और तरीका यह करने के लिए है, numpy के vectorize चाल का उपयोग कर:

import numpy as np 
S = set([0,2,6,8]) 

@np.vectorize 
def contained(x): 
    return x in S 

contained(fake) 
=> array([[ True, False, True], 
      [False, False, False], 
      [ True, False, True]], dtype=bool) 

इस समाधान का चोर कि contained() प्रत्येक तत्व के लिए कहा जाता है (यानी अजगर-अंतरिक्ष में) है, जो इतना एक pure- की तुलना में धीमी बनाता है numpy समाधान।

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