2016-06-23 6 views
6

मैं पाइथन में मैटलैब डेटा फ़ाइल लोड करने के लिए scipy's loadmat फ़ंक्शन का उपयोग कर रहा हूं।numpy ndarray के तत्वों का उपयोग कैसे करें?

from scipy.io import loadmat 

data = loadmat('data.mat') 
fields = data['field'] 

fields के प्रकार numpy.ndarray है:

print 'fields type={}'.format(type(fields)) 
print 'fields dtype={}'.format(fields.dtype) 
print 'fields shape={}'.format(fields.shape) 
fields type=<type 'numpy.ndarray'> 
fields dtype=object 
fields shape=(5,) 

मैं nditer का उपयोग कर सरणी पर पुनरावृति:

for x in np.nditer(fields, flags=['refs_ok']): 
    print 'x={}'.format(x) 
    print 'x type={}'.format(type(x)) 
    print 'x dtype={}'.format(x.dtype) 
    print 'x shape={}'.format(x.shape) 
    break 
x=[u'ACE'] 
x type=<type 'numpy.ndarray'> 
x dtype=object 
x shape=() 

IndexError:

अगर मैं x के पहले तत्व तक पहुँचने का प्रयास मैं एक IndexError:

x[0] 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-102-8c374ae22096> in <module>() 
    17  print 'type={}'.format(type(x)) 
    18  print 'dtype={}'.format(x.dtype) 
---> 19  x[0] 
    20  break 
    21 

IndexError: too many indices for array 

सवाल:

  • कैसे आते हैं, अगर type(x) रिटर्न nump.ndarray यह "सरणी के लिए बहुत सारे सूचकांक" कहता है?
  • मैं x की सामग्री को स्ट्रिंग में कैसे निकाल सकता हूं?

यहाँ संस्करणों मैं उपयोग कर रहा हूँ कर रहे हैं:

print 'python version: {}'.format(sys.version) 
print 'numpy version: {}'.format(numpy.__version__) 
print 'scipy version: {}'.format(scipy.__version__) 
python version: 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] 
numpy version: 1.11.0 
scipy version: 0.17.1 
+0

क्या आप 'x.shape' प्रिंट कर सकते हैं? –

+0

@C_Z_ - 'x.shape' को शामिल करने के लिए प्रश्न को अपडेट किया गया, जो'() ' –

+1

देता है यह 0 डी सरणी है, जिसे आपको 0 तत्व टुपल, 'x [()]' के साथ अनुक्रमित करना होगा। मेरा जवाब देखें – hpaulj

उत्तर

6

विस्तार से अपनी त्रुटियों को देख के बिना मैं कुछ कठिनाइयों की जानकारी कर सकते हैं।

.mat में MATLAB matrices (हमेशा 2 डी या उच्चतर), कक्ष और संरचनाएं होंगी।

loadmat विभिन्न तरीकों से उनको प्रस्तुत करता है। ऐसे शब्द हैं जिन्हें आपको नाम से अनुक्रमित करना है। वस्तु arrays (dtype = वस्तु) हैं। और एन एन न्यूमेरिक या स्ट्रिंग एरे हैं। संख्यात्मक सरणी पर जाने के लिए आपको कई स्तरों के माध्यम से काम करना पड़ सकता है।

एक सरणी के आकार (आकार) और इसके 'प्रकार' की जांच करें। यदि आकार () और dtype ऑब्जेक्ट है, तो इसे y=x[()] के साथ निकालें।

यहाँ इस तरह के एक 0 दि वस्तु सरणी के एक उदाहरण है:

In [4]: y=np.arange(3) 

In [5]: x=np.empty((), dtype=object)  
In [6]: x[()]=y 

In [7]: x 
Out[7]: array(array([0, 1, 2]), dtype=object) 

In [8]: x.shape 
Out[8]:() 

In [9]: x.dtype 
Out[9]: dtype('O') 

In [10]: x[0] 
... 
IndexError: too many indices for array 

In [11]: x[()] 
Out[11]: array([0, 1, 2]) 

x एक 0 d सरणी (x.ndim) है, इसलिए यह एक 0 तत्व टपल, () साथ अनुक्रमित किया जाना चाहिए। एक MATLAB प्रोग्रामर के लिए जो अजीब लग सकता है।

numpy (सामान्य रूप से पायथन) में x[a,b,c]x[(a,b,c)] और ind=(a,b,c); x[ind] जैसा ही है। दूसरे शब्दों में, [] में तर्क मानों का एक छोटा सा माना जाता है।(1,2) एक 2 तत्व ट्यूपल है, (1,) एक तत्व है ((1) केवल एक समूह है), और () एक 0 तत्व ट्यूपल है। तो x[()] नियमित nd इंडेक्सिंग नोटेशन का विस्तार है। यह एक विशेष मामला नहीं है।

+0

धन्यवाद, उस सरणी इंडेक्सिंग नोटेशन ('x [()]') का उपयोग करके। क्या आपके पास एक संसाधन है जहां मैं उस नोटेशन पर पढ़ सकता हूं? मैंने पहले कभी नहीं देखा है। –

+1

मैंने इस नोटेशन पर एक अनुच्छेद जोड़ा। – hpaulj

+0

समझ गया, स्पष्टीकरण के लिए धन्यवाद! –

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