2010-01-21 6 views
6

से प्रत्येक पंक्ति में विशिष्ट कॉलम का चयन करना मैं एक numpy सरणी की प्रत्येक पंक्ति के लिए विशिष्ट कॉलम तत्वों का चयन करने का प्रयास कर रहा हूं। उदाहरण के लिए, निम्न उदाहरण में:सरणी

In [1]: a = np.random.random((3,2)) 
Out[1]: 
array([[ 0.75670668, 0.1283942 ], 
     [ 0.51326555, 0.59378083], 
     [ 0.03219789, 0.53612603]]) 

मैं पहली पंक्ति के पहले तत्व, दूसरी पंक्ति का दूसरा तत्व है, और तीसरी पंक्ति के पहले तत्व का चयन करना चाहते हैं। तो मैं निम्नलिखित करने की कोशिश की:

In [2]: b = np.array([0,1,0]) 

In [3]: a[:,b] 

लेकिन इस निम्नलिखित उत्पादन का उत्पादन:

Out[3]: 
array([[ 0.75670668, 0.1283942 , 0.75670668], 
     [ 0.51326555, 0.59378083, 0.51326555], 
     [ 0.03219789, 0.53612603, 0.03219789]]) 

जो स्पष्ट रूप से मैं क्या देख रहा हूँ नहीं है। क्या लूप का उपयोग किए बिना मैं क्या करना चाहता हूं?

उत्तर

8

आप उपयोग कर सकते हैं:

a[np.arange(3), (0,1,0)] 

अपने उदाहरण में ऊपर।

+0

दरअसल। * स्लाइसिंग * दिए गए अक्ष को संरक्षित करता है जबकि आप दोनों आयामों के साथ जो चाहते थे उसे दस्तावेज में * फैंसी इंडेक्सिंग * कहा जाता है। – dwf

+0

दाएं। उदाहरण के लिए, 'एक [0: 2,0: 2] 'और' एक [[0,1], [0,1]]' अलग-अलग चीजें लौटाएं। –

2

यह थोड़ा सा दस्तावेज करने के प्रयास के रूप में इतना उत्तर नहीं है। जवाब से ऊपर के लिए, हम होगा:

>>> import numpy as np 
>>> A = np.array(range(6)) 
>>> A 
array([0, 1, 2, 3, 4, 5]) 
>>> A.shape = (3,2) 
>>> A 
array([[0, 1], 
     [2, 3], 
     [4, 5]]) 
>>> A[(0,1,2),(0,1,0)] 
array([0, 3, 4]) 

व्यक्ति पंक्ति की एक सूची (या टपल) को निर्दिष्ट करना और स्तंभ निर्देशांक फैंसी अनुक्रमण सरणी के अनुमति देता है। टिप्पणी में पहला उदाहरण पहले जैसा दिखता है, लेकिन सूचकांक स्लाइस हैं। वे पूरी श्रृंखला से अधिक का विस्तार नहीं है, और आकार सरणी दिया जाता है की अलग है:

>>> A[0:2,0:2] 
array([[0, 1], 
     [2, 3]]) 

टिप्पणी में दूसरा उदाहरण के लिए

>>> A[[0,1],[0,1]] 
array([0, 3]) 

तो ऐसा लगता है कि स्लाइस अलग हैं, लेकिन इसके अलावा, इंडेक्स कैसे बनाए जाते हैं, इस पर ध्यान दिए बिना, आप एक tuple या सूची (x-values, y-values) की सूची निर्दिष्ट कर सकते हैं, और सरणी से उन विशिष्ट तत्वों को पुनर्प्राप्त कर सकते हैं।

3

ठीक है, बस यहाँ स्पष्ट करने के लिए, की सुविधा देता है

A=diag(arange(0,10,1)) 

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 1, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 2, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 3, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 4, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 5, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 6, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 7, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 8, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 9]]) 

तो

A[0][0:4] 

देता

array([0, 0, 0, 0]) 
012 देता है एक सरल उदाहरण करना

पहली पंक्ति है कि, तत्वों 0 3. करने के लिए लेकिन

A[0:4][1] 

पहले 4 पंक्तियाँ, प्रत्येक में 2 तत्व नहीं देता है। इसके बजाय हमें

array([0, 1, 0, 0, 0, 0, 0, 0, 0, 0]) 

यानी पूरे 2 कॉलम प्राप्त करें।

A[0:4,1] 

array([0, 1, 0, 0]) 

देता है मुझे यकीन है कि वहाँ इस के लिए एक बहुत अच्छा कारण है हूँ और जो प्रोग्रामर करने के लिए उपयुक्त समझ में आता है लेकिन हम में से उन है कि महान धर्म में uninitiated के लिए यह काफी भ्रामक हो सकते हैं ।

+0

ए [0: 4] आकार की एक नई सरणी बनाता है (4,10)। ए [0: 4, वाई] के साथ, आप सरणी के दूसरे आयाम के लिए पूछ रहे हैं, जबकि ए [0: 4] [x] के लिए, आप नई सरणी के पहले आयाम के लिए पूछ रहे हैं! आप इसे ए [0: 4,:] [1 ,:] लिख सकते हैं यदि यह आपको यह देखने में मदद करता है कि मंद 1 या मंद 2 – bendaizer

+0

के लिए पूछ रहे हैं कि डायग का उपयोग करके यह स्वयं और दूसरों के लिए अधिक भ्रमित हो रहा है, क्योंकि वास्तव में 'ए [ 0: 4] [1] 'आपको दूसरा * पंक्ति * दिया, दूसरा स्तंभ नहीं। –

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

  • कोई संबंधित समस्या नहीं^_^