2016-08-07 21 views
0

Ich verwende Code von scipy.io.loadmat nested structures (i.e. dictionaries), um eine Matlab-Struktur in Python zu lesen. Ich möchte eine Liste von Namen von Feldern erstellen, die in der dtype-Liste erscheinen. Mein Code ist:Feldnamen aus dtype-Auflistung?

matfile =loadmat(dataDirStr + matFileName, struct_as_record=True) # a dictionary 
theseKeys = matfile.keys()   #as list 
thisDict = matfile[ theseKeys[ 1 ] ] #type = void1152, size = (1, 118) 
# 
#screen display of contents is: 
# 
dtype = [ ('Aircraft_Name', 'O'), ('Low_Mass', 'O') ] 

mit, dass also im Sinne, würde Ich mag eine Liste der Einträge in dtype erstellen:

thisList = [ 'Aircraft_Name', 'Low_Mass' ] #etc., etc. 

so dass die Reihenfolge der Namen in dem dtype Eintrag bleibt erhalten .

Können Sie mir bitte helfen?

Antwort

1

einfach eine Liste Verständnis verwenden und das erste Element aus jedem Tupel abholen, in jeder Iteration:

thisList = [item[0] for item in dtype] 

oder als funktionale Ansatz Verwendung zip():

thisList = next(zip(*dtype)) # in python 2.x zip(*dtype)[0] 
+0

Fair genug Vorschläge, aber wie kann ich 'dtype' von seiner Position innerhalb der dict-Variable zugreifen? Ich kann den Screenshot senden, wenn das hilft. –

+0

Daten sieht so auf dem Bildschirm aus (sorry) .... –

+0

([u'B788__ '], [[99817]], [[140000]], [[160000]], [[43000]], dtype = [('Aircraft_Name', 'O'), ('Low_Mass', 'O'), ( –

0
In [168]: dt=np.dtype([ ('Aircraft_Name', 'O'), ('Low_Mass', 'O') ]) 
In [169]: dt 
Out[169]: dtype([('Aircraft_Name', 'O'), ('Low_Mass', 'O')]) 
In [170]: dt.names 
Out[170]: ('Aircraft_Name', 'Low_Mass') 

Dieses Tupel ist praktisch zum Einstellen oder Abrufen aller Felder, eins nach dem anderen:

In [171]: x=np.empty((3,),dtype=dt) 
In [172]: x 
Out[172]: 
array([(None, None), (None, None), (None, None)], 
     dtype=[('Aircraft_Name', 'O'), ('Low_Mass', 'O')]) 
In [173]: for name in x.dtype.names: 
    ...:  x[name][:]=['one','two','three'] 
    ...:  
In [174]: x 
Out[174]: 
array([('one', 'one'), ('two', 'two'), ('three', 'three')], 
     dtype=[('Aircraft_Name', 'O'), ('Low_Mass', 'O')]) 

descr ist eine Listenbeschreibung des Dtypes der Variablen; Namen können davon auch gezogen werden:

In [180]: x.dtype.descr 
Out[180]: [('Aircraft_Name', '|O'), ('Low_Mass', '|O')] 
In [181]: [i[0] for i in x.dtype.descr] 
Out[181]: ['Aircraft_Name', 'Low_Mass'] 
In [182]: x.dtype.names 
Out[182]: ('Aircraft_Name', 'Low_Mass') 
+0

) Vielen Dank. Die Variable dt ist jedoch, wie oben erwähnt, in die dict-Variable eingebettet, und ich möchte sie abrufen. Sie haben mir die Informationen gegeben, um es zu erstellen, und das ist in Ordnung. Aber wie wäre es mit der dynamischen Erstellung der Liste aus dem dtype innerhalb der dict-Variablen? Danke. –

+0

Wenn thisDict die Variable ist, ein Array, dann ThisDict. dtype' ist sein 'dtype' und' thisDict.dtype.names' sind die Feldnamen. – hpaulj

+0

Bingo. Vielen Dank. –