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