2016-08-07 6 views
0

Я использую код от scipy.io.loadmat nested structures (i.e. dictionaries), чтобы прочитать структуру Matlab в Python. Я хочу составить список имен полей, которые отображаются в списке dtype. Мой код:Имена полей из списка dtype?

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') ] 

Итак, имея это в виду, я хотел бы создать список записей в DTYPE: такие, что порядок имен в записи DTYPE сохраняется

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

,

Не могли бы вы помочь мне?

ответ

1

Просто используйте список понимание и забрать первый элемент из каждого кортежа, в каждой итерации:

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

Или в качестве функционального использования подхода zip():

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

Справедливые предложения, но как мне получить доступ к «dtype» из его местоположения внутри переменной dict? Если это поможет, я могу отправить экранный снимок. –

+0

Данные выглядят как на экране (извините) .... –

+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') 

Этот кортеж удобен для установки или выборки всех полей один за другим:

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 - это описание описания dtype переменной; из этого также можно извлечь имена:

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

Спасибо. Однако переменная dt встроена в переменную dict, как указано выше, и это то, что я хочу получить. Вы указали мне информацию для ее создания, и все в порядке. Но как насчет динамического создания списка из dtype в переменной dict? Спасибо. –

+0

Если 'thisDict' - это переменная, массив, то' thisDict. dtype' - это 'dtype', а' thisDict.dtype.names' - имена полей. – hpaulj

+0

Bingo. Большое спасибо. –

Смежные вопросы