2010-03-15 10 views
15

मैंUnpacking tuples/सरणियों/NumPy सरणी के लिए सूचकांक के रूप में सूचियों

>>> A = numpy.array(((1,2),(3,4))) 
>>> idx = (0,0) 
>>> A[*idx] 

करने के लिए सक्षम होने के लिए प्यार करता हूँ और फिर भी यह मान्य सिंटैक्स नहीं है

1 

मिलेगा।

>>> A[idx[0], idx[1]] 

स्पष्ट रूप से लिखने के बिना ऐसा करने का कोई तरीका है?

संपादित करें: उत्तरों के लिए धन्यवाद। मेरे कार्यक्रम में मैं एक टुपल की बजाय एक अजीब सरणी के साथ अनुक्रमणित कर रहा था और अजीब परिणाम प्राप्त कर रहा था। आलोक के सुझाव के रूप में एक टुपल में कनवर्ट करना चाल करता है।

+0

यह एक कठिन फोन था। अंत में मैंने सोचा कि विकी आपके से अधिक अंक के साथ कर सकता है। फिर भी आपको एक उपरांत दिया गया है :-) – ntimes

+0

इसके अलावा, मुझे लगता है कि विकी के जवाब से पता चलता है कि मैं सीधे उदाहरण टुपल का उपयोग कर सकता हूं। – ntimes

उत्तर

11

यह आसान है की तुलना में आपको लगता है:

>>> import numpy 
>>> A = numpy.array(((1,2),(3,4))) 
>>> idx = (0,0) 
>>> A[idx] 
1 
+3

क्यों नहीं 'idx = [0,0] '? यह काम नहीं प्रतीत होता है, क्यों? – Alcott

+0

यह 'tuples' और' arrays 'के बीच के अंतर के कारण है – TRiNE

11

A[tuple(idx)] 

प्रयास करें जब तक आप एक अधिक जटिल उपयोग के मामले कि इस उदाहरण के रूप में सरल नहीं है है, सब से ऊपर सरणियों के लिए काम करना चाहिए।

+0

'idx' पहले से ही एक tuple है। –

+1

@ माइक: हाँ, लेकिन सवाल शीर्षक कहता है कि यह एक सूची या सरणी हो सकती है। –

+0

आह, मुझे वह याद आया। –

2

एक वस्तु अनुक्रमण कॉल:

object.__getitem__(index) 

जब आप ऐसा करेंगे एक [1, 2], यह के बराबर है:

A.__getitem__((1, 2)) 

तो जब आप कार्य करें:

b = (1, 2) 

A[1, 2] == A[b] 
A[1, 2] == A[(1, 2)] 

दोनों कथन सत्य का मूल्यांकन करेंगे।

आप एक सूची के साथ सूचकांक को भी हो, तो यह हो सकता है नहीं सूचकांक एक ही है, के रूप में [1, 2]! = (1, 2)

2

नहीं unpacking आवश्यक है -मुझे आप एक है [ और ] के बीच अल्पविराम, आप तर्क बनाते हुए एक tuple बना रहे हैं। foo[bar, baz]foo[(bar, baz)] के बराबर है। तो यदि आपके पास एक tuple t = bar, baz है तो आप बस foo[t] कहेंगे।