2015-03-11 3 views
6

समकक्ष समकक्ष मैट्रिक्स सबस्क्रिप्ट को रैखिक सूचकांक में परिवर्तित करने के लिए दो कार्य हैं और इसके विपरीत। (ind2sub और sub2ind)MATLAB ind2sub पाइथन

मुझे आर के बराबर मिला लेकिन क्या पाइथन में समकक्ष तरीका है?

+1

चेक यहाँ: https://github.com/jjakeman/pyheat/blob/master/utilities/math_utils.py – rayryeng

+3

मुझे लगता है कि अगर आप हमें बताएंगे कि आप क्या करने की कोशिश कर रहे हैं तो आपको बेहतर भाग्य मिलेगा। "मैं इस फ़ंक्शन को दूसरी भाषा से दोहराने की कोशिश कर रहा हूं" अक्सर बहुत उपयोगी नहीं होता है। एक बेहतर प्रश्न कुछ ऐसा स्वरूपित किया जाएगा जैसा कि आप लिखने की कोशिश कर रहे फ़ंक्शन का विवरण (नमूना इनपुट और आउटपुट के साथ)> - <कुछ कोड जो आपने कोशिश की है> - <(वैकल्पिक) त्रुटियां आपका कोड फेंक रहा है) और विवरण क्या काम नहीं कर रहा है> - <कथन है कि यह भाषा वाई से कार्य X को पुन: उत्पन्न कर रहा है, जो भाषा Y> – mgilson

+0

से परिचित लोगों के लिए है, आप numpy के ['unravel_index'] (http://docs.scipy.org/doc) में देख सकते हैं /numpy/reference/generated/numpy.unravel_index.html)। – eigenchris

उत्तर

14

एक गूगल खोज मुझे इस लिंक के लिए नेतृत्व: https://github.com/jjakeman/pyheat/blob/master/utilities/math_utils.py

मैं क्या बता सकते हैं, वहाँ MATLAB में उन कार्यों का कोई प्रत्यक्ष कार्यान्वयन है।


बस पता चला है कि मैं दस्तावेज़ को ठीक से नहीं पढ़ सकता। यदि आप sub2ind की कार्यक्षमता चाहते हैं, तो आप ravel_multi_index फ़ंक्शन चाहते हैं। समारोह घोषणा का कहना है कि आपको दो इनपुट की आवश्यकता है। पहला इनपुट 2 डी numpy सरणी है जहां प्रत्येक पंक्ति किसी विशेष आयाम के लिए स्थान होती है। उदाहरण के लिए, यदि आप 2 डी मैट्रिक्स पर ind2sub लागू करना चाहते हैं, तो आप एक 2 डी numpy सरणी निर्दिष्ट करेंगे जहां पहली पंक्ति में आपके द्वारा इच्छित सभी पंक्ति स्थानों के होते हैं, और दूसरी पंक्ति में आपके इच्छित कॉलम स्थानों के होते हैं। दूसरा इनपुट टुपल है जो प्रत्येक आयाम का आकार निर्धारित करता है, इसलिए 2 डी सरणी के लिए, यह पंक्तियों और स्तंभों की संख्या होगी।

ind2sub करने के लिए, आप unravel_index फ़ंक्शन चाहते हैं। पहला इनपुट रैखिक सूचकांक की एक सरणी है जिसे आप अपने सरणी में प्रत्येक आयाम के स्थानों में परिवर्तित करना चाहते हैं। दूसरा इनपुट पहले की तरह आयामों का एक गुच्छा है।

मैं पोस्टरिटी के लिए नीचे पोस्ट छोड़ने जा रहा हूं, अगर आप इन्हें आजमाकर लागू करना चाहते हैं।


हालांकि, आप निश्चित रूप से स्वयं को लागू कर सकते हैं। मुझे लगता है कि आपने अपनी पोस्ट को numpy के साथ टैग किया है क्योंकि आप numpy -esque समाधान चाहते हैं। याद रखें, numpy में आप पंक्ति प्रमुख, नहीं कॉलम में तत्वों का उपयोग प्रमुख, और इसलिए दो सरणियों ऐसी है कि एक पंक्ति के लिए है और स्तंभ इंडेक्स (0-अनुक्रमित), 2 डी के लिए sub2ind matrices बहुत बस है के लिए अन्य दी:

def sub2ind(array_shape, rows, cols): 
    return rows*array_shape[1] + cols 

array_shape दो तत्वों जहां पहला तत्व मैट्रिक्स और दूसरा तत्व में पंक्तियों की संख्या स्तंभों की संख्या है की एक सरणी है। ,

ind = r*cols + c 

(r,c) पंक्ति और स्तंभ सूचकांक आप चाहते हैं बशर्ते वह 0 अनुक्रमित है: जैसा कि आपको याद हैं, तो आप एक तत्व एक पंक्ति-प्रमुख मैट्रिक्स में से पहुँच सकते हैं।

def ind2sub(array_shape, ind): 
    rows = (ind.astype('int')/array_shape[1]) 
    cols = (ind.astype('int') % array_shape[1]) # or numpy.mod(ind.astype('int'), array_shape[1]) 
    return (rows, cols) 

यहाँ, उत्पादन एक दो तत्व टपल जहां पहला तत्व पंक्ति स्थानों है और दूसरा तत्व स्तंभ वाले स्थानों है: विपरीत रास्ता तय करने के लिए, आप पूर्णांक विभाजन और मापांक का प्रयोग करेंगे। अपनी इच्छित पंक्ति तक पहुंचने के लिए ind2sub को सारांशित करने के लिए, आप रैखिक अनुक्रमणिका लेते हैं और स्तंभों के साथ एक पूर्णांक विभाजन करते हैं। इच्छित कॉलम प्राप्त करने के लिए, आपको मॉड्यूलस या शेष मिल जाए। 3 आयामों और आगे जाकर थोड़ा और जटिल है। मैं आपको अधिक जानकारी के लिए ऊपर दिए गए लिंक पर एक नज़र डालने के लिए छोड़ दूंगा।

जाहिर है, मैंने उपर्युक्त कार्यों में कोई त्रुटि जांच नहीं की है, इसलिए आप उस मामले में अपने लाभ के लिए स्पष्ट रूप से array_shape का उपयोग करेंगे। ऐसा करने का एक बेहतर तरीका है कि तुम क्या होगा कुछ की तरह हैं:

def sub2ind(array_shape, rows, cols): 
    ind = rows*array_shape[1] + cols 
    ind[ind < 0] = -1 
    ind[ind >= array_shape[0]*array_shape[1]] = -1 
    return ind 

def ind2sub(array_shape, ind): 
    ind[ind < 0] = -1 
    ind[ind >= array_shape[0]*array_shape[1]] = -1 
    rows = (ind.astype('int')/array_shape[1]) 
    cols = ind % array_shape[1] 
    return (rows, cols) 

मैं कुछ बुनियादी त्रुटि यह सुनिश्चित करें कि कोई पंक्तियों या स्तंभों ind2sub के लिए sub2ind या रैखिक सूचकांक के लिए सीमा से बाहर हैं जाँच किया था। मैंने उन स्थानों को -1 पर सेट किया है ताकि आप जानते हों कि आप कहीं गड़बड़ कर चुके हैं।

शुभकामनाएं!

3

बिल्डिंग चाहते हैं, आप भी ध्यान रखना चाहिए कि आप फोरट्रान शैली अनुक्रमण का उपयोग करना होगा, और याद करते हैं कि अजगर 0 जबकि MATLAB अनुक्रमित है 1 अनुक्रमित है ।

फोरट्रान शैली की आवश्यकता ने मुझे थोड़ा सा धोखा दिया।

अजगर में:

np.unravel_index(7, [1, 2, 3, 4], 'F') 
(0, 1, 0, 1) 

और MATLAB/सप्टक में

[a, b, c, d] = ind2sub([1, 2, 3, 4], 8) 
a = 1 
b = 2 
c = 1 
d = 2