2011-01-27 8 views
6

का उपयोग करके टुपल लोड करें I मैटलैब उपयोगकर्ता पाइथन के लिए नया हूं। मैं मैटलैब में मैट फ़ाइल में तारों की एक सेल सरणी लिखना चाहूंगा, और पाइथन (शायद scipy.io.loadmat) का उपयोग करके इस मट फ़ाइल को कुछ समान प्रकार (जैसे स्ट्रिंग्स या स्ट्रिंग्स की टुपल) में लोड करना चाहूंगा। लेकिन लोडमैट चीजों को सरणी में पढ़ता है और मुझे यकीन नहीं है कि इसे एक सूची में कैसे परिवर्तित किया जाए। मैंने "टॉलिस्ट" फ़ंक्शन का प्रयास किया जो मेरी अपेक्षा के अनुसार काम नहीं करता है (मुझे पाइथन सरणी या numpy सरणी की खराब समझ है)।मैटलैब मैट फ़ाइलों में स्ट्रिंग्स की सेल सरणी को कैसे पाइथन सूची में लोड करें या Scipy.io.loadmat

मैटलैब कोड:

cell_of_strings = {'thank', 'you', 'very', 'much'}; 
save('my.mat', 'cell_of_strings'); 

अजगर कोड:

matdata=loadmat('my.mat', chars_as_strings=1, matlab_compatible=1); 
array_of_strings = matdata['cell_of_strings'] 

फिर, चर array_of_strings है:

array([[[[u't' u'h' u'a' u'n' u'k']], [[u'y' u'o' u'u']], 
    [[u'v' u'e' u'r' u'y']], [[u'm' u'u' u'c' u'h']]]], dtype=object) 

मुझे यकीन है कि कैसे इस array_of_strings कन्वर्ट करने के लिए नहीं कर रहा हूँ उदाहरण के लिए एक पायथन सूची या टुपल में ताकि यह

जैसा दिखता है
list_of_strings = ['thank', 'you', 'very', 'much']; 

मैं पायथन या numpy में सरणी वस्तु से परिचित नहीं हूँ। आपकी मदद की बहुत सराहना की जाएगी।

उत्तर

4

अपने इस की कोशिश की है:

import scipy.io as si 

a = si.loadmat('my.mat') 
b = a['cell_of_strings']    # type(b) <type 'numpy.ndarray'> 
list_of_strings = b.tolist()   # type(list_of_strings) <type 'list'> 

print list_of_strings 
# output: [u'thank', u'you', u'very', u'much'] 
+2

b.tolist() देता है [[सरणी [[[u't ', u'h', u'a ', u'n', u'k ']], dtype =' Causality

+0

@Denzel लगता है। क्या आपको chars_as_strings = 1, matlab_compatible = 1 का उपयोग करना चाहिए? – Marcin

2

यह list comprehension के लिए एक नौकरी की तरह दिखता है। अपने उदाहरण दोहरा, मैं MATLAB में ऐसा किया:

cell_of_strings = {'thank', 'you', 'very', 'much'}; 
save('my.mat', 'cell_of_strings','-v7'); 

मैं MATLAB, जो डिफ़ॉल्ट रूप से HDF5 प्रारूप में .mat फ़ाइलों की बचत होती है के एक नए संस्करण का उपयोग कर रहा हूँ। loadmat एचडीएफ 5 फाइलों को नहीं पढ़ सकता है, इसलिए '-v7' ध्वज MATLAB को पुराने संस्करण .mat फ़ाइल में सहेजने के लिए मजबूर करना है, जो loadmat समझ सकता है।

import scipy.io as sio 
matdata = sio.loadmat('%s/my.mat' %path, chars_as_strings=1, matlab_compatible=1); 
array_of_strings = matdata['cell_of_strings'] 

मुद्रण array_of_strings देता है::

अजगर में, मैं सेल सरणी जैसे तुमने किया था लोड

[[array([[u't', u'h', u'a', u'n', u'k']], 
      dtype='<U1') 
     array([[u'y', u'o', u'u']], 
      dtype='<U1') 
     array([[u'v', u'e', u'r', u'y']], 
      dtype='<U1') 
     array([[u'm', u'u', u'c', u'h']], 
      dtype='<U1')]] 

चर array_of_strings एक (1,4) numpy वस्तु सरणी है लेकिन वहाँ प्रत्येक वस्तु के भीतर घिरे सरणी हैं। उदाहरण के लिए, array_of_strings का पहला तत्व एक (1,5) सरणी है जिसमें 'धन्यवाद' के लिए अक्षर शामिल हैं।

array_of_strings[0,0][0,0] 
u't' 

जब से हम नेस्टेड सरणियों के साथ काम कर रहे हैं, हम करने के लिए कुछ पुनरावर्ती तकनीक को रोजगार की जरूरत है: यही कारण है,

array_of_strings[0,0] 
array([[u't', u'h', u'a', u'n', u'k']], 
     dtype='<U1') 

पहले अक्षर 'टी' पर पाने के लिए आपको कुछ ऐसा करना है डेटा निकालें, यानी नेस्टेड for लूप। लेकिन सबसे पहले, मैं आपको पहला शब्द निकालने का तरीका दिखाऊंगा:

first_word = [str(''.join(letter)) for letter in array_of_strings[0][0]] 
first_word 
['thank'] 

यहां मैं एक सूची समझ का उपयोग कर रहा हूं। असल में, मैं array_of_strings [0] [0] में प्रत्येक अक्षर के माध्यम से लूपिंग कर रहा हूं और ''.join विधि का उपयोग करके उन्हें संयोजित कर रहा हूं। string() फ़ंक्शन यूनिकोड तारों को नियमित तारों में परिवर्तित करना है।

अब, सूची तार आप चाहते हैं पाने के लिए, हम बस पाश को पत्र के प्रत्येक सरणी के माध्यम से की जरूरत है:

words = [str(''.join(letter)) for letter_array in array_of_strings[0] for letter in letter_array] 
words 
['thank', 'you', 'very', 'much'] 

सूची comprehensions कुछ करने के लिए इस्तेमाल हो रही है ले, लेकिन वे बहुत उपयोगी होते हैं। उम्मीद है की यह मदद करेगा।

+0

शब्द = [letter (''। Join (letter)) letter_array में letter_array में letter_array के लिए letter_array में अक्षर के लिए] शब्द = [str ('' जुड़ें (अक्षर)) letter_array में letter_array में अक्षर के लिए array_array में अक्षर_एरे के लिए होना चाहिए] –

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