2013-06-12 5 views
19

द्वारा एक अम्पी ऐरे की प्रत्येक पंक्ति में एक तत्व का चयन करें "इनपुट_एरे" और "select_id" से "output_array" प्राप्त करने का कोई बेहतर तरीका है?कॉलम इंडेक्स

क्या हम range(input_array.shape[0]) से छुटकारा पा सकते हैं?

>>> input_array = numpy.array([ [3,14], [12, 5], [75, 50] ]) 
>>> select_id = [0, 1, 1] 
>>> print input_array 
[[ 3 14] 
[12 5] 
[75 50]] 

>>> output_array = input_array[ range(input_array.shape[0]), select_id ] 
>>> print output_array 
[ 3 5 50] 
+1

यह करने का एक बीमार रास्ता तुम्हारे पास क्या है की तुलना में बेहतर नहीं np.diagonal है, और निश्चित रूप से, लेकिन '(input_array [:, select_id])' भी आप 'सरणी मिल जाएगा ([3, 5 , 50]) '। – Jaime

उत्तर

29

आप numpy.choose जो एक सूचकांक सरणी से एक सरणी का निर्माण का उपयोग कर दिया सरणी से और सरणियों का एक सेट (अपने मामले input_array में) से चुनने के लिए (अपने मामले select_id में) चुन सकते हैं। हालांकि आपको पहले आयामों से मेल खाने के लिए input_array स्थानांतरित करने की आवश्यकता हो सकती है। निम्नलिखित एक छोटा सा उदाहरण दिखाता है:

In [101]: input_array 
Out[101]: 
array([[ 3, 14], 
     [12, 5], 
     [75, 50]]) 

In [102]: input_array.shape 
Out[102]: (3, 2) 

In [103]: select_id 
Out[103]: [0, 1, 1] 

In [104]: output_array = np.choose(select_id, input_array.T) 

In [105]: output_array 
Out[105]: array([ 3, 5, 50]) 
+0

उन मानों को आउटपुट करने के बजाय, हम उन्हें जगह में कैसे संशोधित करते हैं? – syllogismos

+0

आप इस http://stackoverflow.com/questions/7761393/how-to-modify-a-2d-numpy-array-at-specific-locations-without-a-loop – Steven

0

कैसे के बारे में:

[input_array[x,y] for x,y in zip(range(len(input_array[:,0])),select_id)] 
+0

का उपयोग कर सकते हैं मुझे गणित करना है बहुत सारे डेटा तो मैं numpy के साथ vectorize करने की कोशिश करो। – Bystander

2

मुझे लगता है कि enumerate आसान है।

[input_array[enum, item] for enum, item in enumerate(select_id)] 
+0

इन-लाइन लूप द्वारा समय-बचत हमेशा अच्छा होता है। मुझे वास्तव में बहुत सारे डेटा प्रोसेसिंग के लिए numpy की आवश्यकता है ... – Bystander

1

ध्यान दें कि केवल numpy.choose काम करता है आप 32 या इससे कम विकल्प (अगर इस मामले में, के आयाम (क्योंकि मैं स्वीकार किए जाते हैं जवाब पर एक टिप्पणी के रूप में इस पोस्ट नहीं कर सकते) अपने सरणी जिसके साथ आप अनुक्रमणित कर रहे हैं आकार 32 या छोटे आकार का होना चाहिए)। इसके अतिरिक्त, numpy.choose के लिए documentation कहता है कि "गलत व्याख्या का मौका कम करने के लिए, भले ही निम्नलिखित 'दुर्व्यवहार' नाममात्र रूप से समर्थित है, विकल्प न तो होना चाहिए, न ही एक सरणी, यानी, बाहरीतम अनुक्रम- कंटेनर की तरह या तो एक सूची या एक ट्यूपल होना चाहिए। "

ओपी पूछते हैं:

  1. वहाँ "input_array" और "select_id" से "output_array" पाने के लिए एक बेहतर तरीका है?
    • मैं कहूंगा, जिस तरह से आपने मूल रूप से सुझाव दिया है, यहां प्रस्तुत किए गए लोगों में से सबसे अच्छा लगता है। यह समझना आसान है, बड़े सरणी के लिए तराजू, और कुशल है।
  2. क्या हम सीमा (input_array.shape [0]) से छुटकारा पा सकते हैं?
    • हां, जैसा कि अन्य उत्तरों द्वारा दिखाया गया है, लेकिन स्वीकृत व्यक्ति सामान्य रूप से काम नहीं करता है, जैसा कि ओपी पहले से ही सुझाव देता है।
+1

यह एक बहुत ही लंबी टिप्पणी होगी;) –

+1

हा, जब कोई जवाब के रूप में कुछ लिखता है, तो मुझे लगता है कि यह अब लंबा हो जाता है। और फिर मैंने ओपीएस सवालों को सीधे संबोधित करके इसे "उत्तर" बनाने के लिए बाध्य महसूस किया। – Nathan

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