把你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.
元組已經包括所需的「域」字段中的所有值(你爲什麼選擇混淆的名字也是這樣嗎? )。
用dtype
dt1
創建一個數組,然後填充它。
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
是否每個寄存器都有相同數量的字段? –
不是每個寄存器的字段數有所不同,但我不認爲這會是一個問題。 – GoldenEagle
你最想做什麼樣的索引操作。例如,你主要是通過註冊還是按字段進行索引? –