将numpy记录数组放入另一个记录数组python中

2024-05-29 02:42:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的记录数组。但是每个元素都需要它自己的记录数组来描述关于该元素的信息。现在这不是代码,我只是以可读的方式显示信息。例如:

我有一个寄存器集合,其属性包括宽度和偏移量。在

寄存器列表

Registers     offsets    width

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

每个寄存器还具有一组字段,这些字段具有特定的值,如位和长度

在寄存器_1中,我们有以下字段

^{pr2}$

}

实际的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)

有什么建议吗?在

谢谢你!在


Tags: 代码nameregisternamesnp记录zeros数组
1条回答
网友
1楼 · 发布于 2024-05-29 02:42:58

把你的type(坏名字!)进入dtype

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

构建一个组合dtype。注意'fields'的格式是(dt1,3)-即由3个dt1类型的元素组成的子数组。在

^{pr2}$

填写姓名:

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.

元组包含了“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')])

新数据类型:

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。在

我们可以通过查看fields' field of寄存器[0]is theregfield`数组中的对象的id来验证它们。在

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

相关问题 更多 >

    热门问题