2016-07-08 3 views
6

मैं एक बड़ी numpy सरणी (dtype=int) और जो मुझे लगता है कि सरणी में प्राप्त करना चाहते हैं संख्याओं के एक समूह है, जैसे है के सूचकांकों का पता लगाएं,Numpy पूर्णांक सरणी: एकाधिक लक्ष्य ints

import numpy as np 
values = np.array([1, 2, 3, 1, 2, 4, 5, 6, 3, 2, 1]) 
searchvals = [3, 1] 
# result = [0, 2, 3, 8, 10] 

result सरणी को सॉर्ट करने की आवश्यकता नहीं है।

गति एक मुद्दा है, और values और searchvals दोनों के बाद से बड़ा हो सकता है,

for searchval in searchvals: 
    np.where(values == searchval)[0] 

इसे काट नहीं है।

कोई संकेत?

+0

आउटपुट सरणी प्रारूप क्या होना चाहिए? प्रत्येक पुनरावृत्ति पर विभिन्न आउटपुट लंबाई के कारण, इसे नियमित आकार के सरणी IIUC में संग्रहीत नहीं किया जा सकता है। या हम सभी को एक 1 डी सरणी में जोड़ सकते हैं? – Divakar

+0

आदर्श रूप से, मैं सूचकांक की एक सरणी (जैसे उदाहरण में 'परिणाम') के साथ समाप्त हो जाऊंगा। –

+0

आह प्यारा! उस पर ध्यान नहीं दिया। – Divakar

उत्तर

5

क्या यह तेज़ है?

>>> np.where(np.in1d(values, searchvals)) 
(array([ 0, 2, 3, 8, 10]),) 
1

मैं कहूंगा कि using np.in1d तरह के एक मामले को सुलझाने के लिए सहज ज्ञान युक्त समाधान होगा। कहा कि, this solution के आधार पर यहां np.searchsorted साथ एक विकल्प है -

sidx = np.argsort(searchvals) 
left_idx = np.searchsorted(searchvals,values,sorter=sidx,side='left') 
right_idx = np.searchsorted(searchvals,values,sorter=sidx,side='right') 
out = np.where(left_idx != right_idx)[0] 
0

आप सभी को एक साथ numpy से बचने कर सकते हैं? सूक्ष्म तरीकों पर भरोसा करने की तुलना में सूची सम्मेलन बहुत तेज़ होना चाहिए। यह तब भी काम करेगा जब values को एक numpy सरणी होना चाहिए।

result = [] 
for sv in searchvals: 
    result += [i for i in range(len(values)) if values[i] == sv]