2016-10-15 3 views
6

निम्नलिखित प्रश्न में, https://stackoverflow.com/a/40056135/5714445numpy प्रसारण कैसे तेजी से प्रदर्शन करता है?

Numpy के प्रसारण के लिए एक समाधान है कि() np.view के साथ रखा() np.setdiff1d का उपयोग करने से लगभग 6x तेजी से प्रदान करता है। यह ऐसा करने में कैसे प्रबंधन करता है?

और A[~((A[:,None,:] == B).all(-1)).any(1)] का उपयोग करके इसे और भी गति देता है। दिलचस्प है, लेकिन अभी तक एक और सवाल उठाता है। यह कैसे बेहतर प्रदर्शन करता है?

+0

क्या तुलना में तेज़? – Bakuriu

+0

मेरा बुरा। Np.setdiff1d का उपयोग करने की तुलना में तेज np.view –

+1

के साथ जोड़ा गया एक व्यापक उत्तर नहीं है, लेकिन 'setdiff1d' को दृश्यों के पीछे कई पूर्ण सॉर्टिंग ऑपरेशन की आवश्यकता होती है जबकि उपरोक्त कोड की रेखा केवल स्मृति के ब्लॉक को आवंटित करती है, इसे भरती है और फिर इसे कम कर देती है सूचकांक 'ए' के साथ 1 डी सरणी के लिए। हालांकि, '(ए [:, कोई नहीं ,:] == बी) जैसे कोड का उपयोग करना' ए' और 'बी' के रूप में बहुत अक्षम हो जाता है (संभावित रूप से स्मृति के बड़े पैमाने पर ब्लॉक आवंटित और भरने चाहिए), इसलिए यह हो सकता है वास्तव में धीमे विकल्प बन जाते हैं। –

उत्तर

5

मैं प्रश्न के दूसरे भाग का उत्तर देने का प्रयास करूंगा।

तो, इसके साथ हम तुलना कर रहे हैं:

A[np.all(np.any((A-B[:, None]), axis=2), axis=0)] (I) 

और

A[~((A[:,None,:] == B).all(-1)).any(1)] 

पहले एक के खिलाफ एक मिलान परिप्रेक्ष्य के साथ तुलना करने के लिए, हम इस तरह दूसरा दृष्टिकोण लिख सकता है -

A[(((~(A[:,None,:] == B)).any(2))).all(1)]   (II) 

प्रदर्शन पर विचार करते समय प्रमुख अंतर यह तथ्य होगा कि डब्ल्यू पहले व्यक्ति के रूप में, हम घटाव के साथ गैर-मिलान प्राप्त कर रहे हैं और फिर .any() के साथ गैर-शून्य की जांच कर रहे हैं। इस प्रकार, any() गैर-बूलियन डाइप ऐरे की एक सरणी पर काम करने के लिए बनाया गया है। दूसरे दृष्टिकोण में, इसके बजाय हम इसे A[:,None,:] == B से प्राप्त एक बुलियन सरणी खिला रहे हैं।

In [141]: A = np.random.randint(0,9,(1000,1000)) # An int array 

In [142]: %timeit A.any(0) 
1000 loops, best of 3: 1.43 ms per loop 

In [143]: A = np.random.randint(0,9,(1000,1000))>5 # A boolean array 

In [144]: %timeit A.any(0) 
10000 loops, best of 3: 164 µs per loop 

तो, यह ओर से के करीब 9x speedup के साथ, हम देखते हैं एक बहुत बड़ा लाभ के साथ any() उपयोग करने के लिए -

के देखने के लिए कैसे int dtype बनाम boolean array पर .any() प्रदर्शन एक छोटा सा क्रम परीक्षण करते हैं बूलियन सरणी यह मुझे लगता है कि दूसरा दृष्टिकोण तेजी से बनाने का सबसे बड़ा कारण था।

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