Numpy में खोज

Oct 01 2020

यदि आपने नीचे दिए गए कोड में एब्स (अरैस्ट) किया है, तो मैंने आरोही संख्या को सॉर्ट किया है, मैं इंडेक्स की खोज करने की कोशिश कर रहा हूं जहां साइन नकारात्मक से सकारात्मक में बदल गया है। इसे नीचे दिए गए कोड में लिखा था, लेकिन कुछ कारणों से, मेरा मानना ​​है कि हम इसे बेहतर कर सकते हैं या अधिक अनुकूलित कर सकते हैं। कोई टिप्स और ट्रिक्स?

import numpy as np
arr = np.array([-1,-2,-3, 4, 5, 6])
_cut_index_1 = np.where(arr > 0)[0][0]
_cut_index_2 = np.where(arr < 0)[0][-1]
arr[_cut_index_1] # output:   4
arr[_cut_index_2] # output:  -3

जवाब

4 Juho Oct 03 2020 at 00:45

आपका वर्तमान समाधान इनपुट सरणी पर दो पास करता है (दो इनवोकेशन np.where) जो कहा जाता है कि बेकार है। समस्या को हल करने का एक सरल तरीका है np.argmaxजिसका उपयोग करने में रैखिक समय लगेगा:

import numpy as np
arr = np.array([-1, -2, -3, 4, 5, 6])
np.argmax(arr > 0) # Return (index) 3

इस बिंदु पर, यदि हम यह मान सकते हैं (जैसा कि आप समझ रहे हैं) कि ब्याज की एक ही स्थिति है (और / या कि हम केवल पहले वाले के बारे में परवाह करते हैं, तो बाएं से दाएं पढ़ें) हम कर रहे हैं: बस एक से घटाना उत्तर और आपके पास अन्य कट-ऑफ पॉइंट है (लेकिन जांच लें कि क्या हम एक कोने के मामले में हैं ताकि गैर-वैध सूचकांक वापस न करें)।

लेकिन वास्तव में, यदि आप सुरक्षित रूप से मान सकते हैं कि इनपुट छांटा गया है, तो आप एक रैखिक स्कैन करने से बच सकते हैं और पूरे इनपुट को भी नहीं पढ़ सकते हैं। इसके लिए आपको एक द्विआधारी खोज के माध्यम से कर सकते हैं searchsorted । सैद्धांतिक रूप से, यह तेज (यानी, लॉगरिदमिक बनाम सबसे खराब स्थिति में रैखिक) है, लेकिन व्यवहार में यह सरणी के आकार पर निर्भर करेगा। यही है, छोटे पर्याप्त सरणियों के लिए कैशे लोकलिटी (या, कम से कम, जो आपके हार्डवेयर विवरण को मोडुलो होना चाहिए) के कारण एक लीनियर स्कैन तेजी से होगा।