2015-10-29 42 views
0

我有以下記錄數組。但是每個元素都需要它自己的記錄數組來描述關於該元素的信息。現在,這不是代碼,我只是以可讀的方式顯示信息。例如:在另一個記錄數組中放置一個numpy記錄數組python

我有一個像寬度和偏移量屬性的寄存器的集合。寄存器

列表

Registers  offsets width 

Register_1 1   5 
Register_2 2   10 
Register_3 3   15 
Register_4 4   20 

每個寄存器還具有一組具有類似的位和長度

內部寄存器_1的特定值的字段,我們有以下字段

register_1 
{ 
#field names  bit  length 
field_1   1  10 
field_2   2  20 
field_3   3  30 

}

實際Python代碼

dtype={ 
    'names' : ('name','offset','width'), 
    'formats' : ('U20','U20','U20')} 

registers= np.zeros(10,dtype) 

registers[0]=('register_1','1','5') 
registers[1]=('register_2','2','10') 
registers[2]=('register_3','3','15') 
registers[3]=('register_4','4','20') 

現在我想將每個寄存器與它們的字段關聯起來,首先想到的是將另一個記錄數組嵌套到我的寄存器記錄數組中。

僞Python代碼

type={ 
    'names' : ('name','bit','length'), 
    'formats' : ('U20','U20','U20')} 

fields= np.zeros(10,type) 

dtype={ 
    'names' : ('name','offset','width',fields), 
    'formats' : ('U20','U20','U20','U20')} 

regsiters= np.zeros(10,dtype) 

有什麼建議?

謝謝!

+0

是否每個寄存器都有相同數量的字段? –

+0

不是每個寄存器的字段數有所不同,但我不認爲這會是一個問題。 – GoldenEagle

+0

你最想做什麼樣的索引操作。例如,你主要是通過註冊還是按字段進行索引? –

回答

2

把你type(壞名!)成dtype

In [277]: dt1=np.dtype(type) 
In [278]: dt1 
Out[278]: dtype([('name', '<U20'), ('bit', '<U20'), ('length', '<U20')]) 

構建複合dtype。請注意,「字段」的格式爲(dt1,3) - 即由dt1類型的3個元素組成的子陣列。

In [279]: dt2=np.dtype({ 
    'names' : ('name','offset','width','fields'), 
    'formats' : ('U20','U20','U20',(dt1,3))}) 
In [280]: registers=np.zeros(4,dtype=dt2) 
In [281]: registers 
Out[281]: 
array([('', '', '', [('', '', ''), ('', '', ''), ('', '', '')]), 
     ('', '', '', [('', '', ''), ('', '', ''), ('', '', '')]), 
     ('', '', '', [('', '', ''), ('', '', ''), ('', '', '')]), 
     ('', '', '', [('', '', ''), ('', '', ''), ('', '', '')])], 
     dtype=[('name', '<U20'), ('offset', '<U20'), ('width', '<U20'), ('fields', [('name', '<U20'), ('bit', '<U20'), ('length', '<U20')], (3,))]) 

填寫姓名:

In [283]: registers['name']='register_1 register_2 register_3 register_4'.split() 

和其他2個字段:

In [284]: registers['offset']=[1,2,3,4] 
In [285]: registers['width']=[5,10,15,20] 
In [286]: registers 
Out[286]: 
array([('register_1', '1', '5', [('', '', ''), ('', '', ''), ('', '', '')]), 
     ('register_2', '2', '10', [('', '', ''), ('', '', ''), ('', '', '')]), 
     ('register_3', '3', '15', [('', '', ''), ('', '', ''), ('', '', '')]), 
     ('register_4', '4', '20', [('', '', ''), ('', '', ''), ('', '', '')])], 
     dtype=[('name', '<U20'), ('offset', '<U20'), ('width', '<U20'), ('fields', [('name', '<U20'), ('bit', '<U20'), ('length', '<U20')], (3,))]) 

registers[0]元件的fields值可以以相同的方式被填充在:

In [288]: registers[0]['fields'] 
Out[288]: 
array([('', '', ''), ('', '', ''), ('', '', '')], 
     dtype=[('name', '<U20'), ('bit', '<U20'), ('length', '<U20')]) 
現在這 registers有4個領域,你不能在他們3補:

In [289]: registers[0]=('register_1','1','5') 
... 
ValueError: size of tuple must match number of fields. 

元組已經包括所需的「域」字段中的所有值(你爲什麼選擇混淆的名字也是這樣嗎? )。

dtypedt1創建一個數組,然後填充它。

In [290]: regfield=np.zeros(3,dtype=dt1) 
In [291]: regfield 
Out[291]: 
array([('', '', ''), ('', '', ''), ('', '', '')], 
     dtype=[('name', '<U20'), ('bit', '<U20'), ('length', '<U20')]) 
In [292]: regfield[0]=('field1',1,10) 
In [293]: regfield[1]=('field2',2,20) 
In [294]: regfield[2]=('field3',3,30) 

現在您可以將它作爲值包含在registers元組中。

In [295]: registers[0]=('register_1','1','5',regfield) 
In [296]: registers[0] 
Out[296]: ('register_1', '1', '5', [('field1', '1', '10'), ('field2', '2', '20'), ('field3', '3', '30')]) 

我可以複製的字段名到其他寄存器:

In [300]: fieldnames=registers['fields']['name'][0] 
In [301]: registers['fields']['name'] 
Out[301]: 
array([['field1', 'field2', 'field3'], 
     ['', '', ''], 
     ['', '', ''], 
     ['', '', '']], 
     dtype='<U20') 
In [302]: registers['fields']['name']=fieldnames 
In [303]: registers['fields']['name'] 
Out[303]: 
array([['field1', 'field2', 'field3'], 
     ['field1', 'field2', 'field3'], 
     ['field1', 'field2', 'field3'], 
     ['field1', 'field2', 'field3']], 
     dtype='<U20') 
In [304]: registers['fields'] 
Out[304]: 
array([[('field1', '1', '10'), ('field2', '2', '20'), ('field3', '3', '30')], 
     [('field1', '', ''), ('field2', '', ''), ('field3', '', '')], 
     [('field1', '', ''), ('field2', '', ''), ('field3', '', '')], 
     [('field1', '', ''), ('field2', '', ''), ('field3', '', '')]], 
     dtype=[('name', '<U20'), ('bit', '<U20'), ('length', '<U20')]) 

新的D型:

In [333]: dt3=np.dtype({ 
    'names' : ('name','offset','width','fields'), 
    'formats' : ('U20','U20','U20', 'O')}) 
In [334]: registers=np.zeros(4,dtype=dt3) 
In [335]: registers 
Out[335]: 
array([('', '', '', 0), ('', '', '', 0), ('', '', '', 0), ('', '', '', 0)], 
     dtype=[('name', '<U20'), ('offset', '<U20'), ('width', '<U20'), ('fields', 'O')]) 

分配值registers[0]regfield我之前定義的3元素數組。

In [337]: registers[0]=('register_1', '1', '5', regfield) 
In [338]: registers 
Out[338]: 
array([ ('register_1', '1', '5', [('field1', '1', '10'), ('field2', '2', '20'), ('field3', '3', '30')]), 
     ('', '', '', 0), 
     ('', '', '', 0), 
     ('', '', '', 0)], 
     dtype=[('name', '<U20'), ('offset', '<U20'), ('width', '<U20'), ('fields', 'O')]) 
... 

顯示是類似於我們之前有什麼,但現在每個寄存器可以有不同數量的fields

我們可以通過查看它們的ID來驗證fields' field of中的對象是否在regfield數組中註冊了[0] is the數組。

In [343]: id(regfield) 
Out[343]: 166843840 
In [344]: id(registers[0]['fields']) 
Out[344]: 166843840 
+0

感謝您的迴應,所以您將每個這些都放在數組中的特定點?你能解釋In [300]嗎?爲什麼從277開始? – GoldenEagle

+0

行號來自我已經使用好幾天的Ipython會話。對不起,我沒有爲你的問題開始一個新的會議。 :)在'IN [300]我正在試驗設置所有寄存器的字段值,這些值是我之前爲寄存器[0]設置的值。不保證這是最好的方法。 – hpaulj

+0

使用'dt2'將字段數據與其他寄存器字段放在一起。所有'寄存器'必須具有相同數量的'字段'。另外這個字段可以是'dtype = object',如@ali_m所示。然後只有一個指針被放置在'寄存器'數組中,並且'字段'數據位於內存中其他位置的單獨數組中。 – hpaulj

相關問題