2016-06-23 26 views
6

Ich benutze Scipys loadmat Funktion, um eine Matlab-Datei in Python zu laden.Zugriff auf Elemente von numpy ndarray?

from scipy.io import loadmat 

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

Die Art der fields ist 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,) 

I iterieren das Array unter Verwendung 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[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 

Fragen:

Wenn ich versuche, das erste Element x ich eine IndexError erhalten Zugriff auf

  • Wie kommt es, wenn type(x) kehrt nump.ndarray es sagt "zu viele Indizes für Array"?
  • Wie kann ich den Inhalt von x in eine Zeichenfolge extrahieren?

Hier sind die Versionen Ich verwende:

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

Können Sie 'x.shape' ausdrucken? –

+0

@C_Z_ - Die Frage wurde aktualisiert, um 'x.shape' einzufügen, was '()' –

+1

zurückgibt. Das ist ein 0d-Array, das Sie mit einem 0-Element-Tupel, 'x [()]', indizieren müssen. Siehe meine Antwort. – hpaulj

Antwort

6

Ohne auf Ihre Fehler im Detail suchen ich einige Gefahren hinweisen kann.

Die .mat enthält MATLAB-Matrizen (immer 2d oder höher), Zellen und Strukturen.

loadmat macht diese auf verschiedene Arten. Es gibt Wörterbücher, die Sie nach Namen indexieren müssen. Es gibt Objekt-Arrays (dtype = Objekt). Und es gibt numerische oder String-Arrays. Möglicherweise müssen Sie mehrere Ebenen durchlaufen, um das numerische Array zu erhalten.

Überprüfen Sie die 'Form' (Größe) eines Arrays und seinen 'Dtype'. Wenn die Form () und dtype Objekt ist, extrahieren Sie sie mit y=x[()].

Hier ist ein Beispiel eines solchen 0T Objektarray:

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 a 0d-Array (x.ndim), so muss es mit einem 0-Element Tupels indexiert werden, (). Für einen MATLAB-Programmierer, der merkwürdig erscheinen kann.

In numpy (Python im Allgemeinen), x[a,b,c] ist das gleiche wie x[(a,b,c)] und ind=(a,b,c); x[ind]. Mit anderen Worten, die Argumente in [] sind als Tupel von Werten zu verstehen.(1,2) ist ein 2-Element-Tupel, (1,) ist ein Element (ist nur eine Gruppierung), und () ist ein 0-Element-Tupel. So x[()] ist nur eine Erweiterung der regulären nd Indexierungsnotation. Es ist kein spezieller Fall.

+0

Danke, mit dieser Array-Indizierung Notation ('x [()]') gearbeitet. Haben Sie eine Ressource, wo ich diese Notation nachlesen kann? Das habe ich noch nie zuvor gesehen. –

+1

Ich habe einen Absatz zu dieser Notation hinzugefügt. – hpaulj

+0

Verstanden, danke für die Erklärung! –

Verwandte Themen