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