可以将结构化数据类型视为具有一定长度的字节序列(结构的项目大小),该字节序列被解释为字段的集合。每个字段在结构中都有一个名称,一个数据类型和一个字节偏移量。
– dtype(fieldname, datatype, shape)
1.元组列表,每个字段一个元组
np.dtype([(‘x’,‘f4’),(‘y’,np.float32),(‘z’,‘f4’,(2,2))])
dtype([(‘x’, ‘<f4’), (‘y’, ‘<f4’), (‘z’, ‘<f4’, (2, 2))])
np.dtype([(‘x’,‘f4’),(’’,‘i4’),(‘z’,‘i8’)])
dtype([(‘x’, ‘<f4’), (‘f1’, ‘<i4’), (‘z’, ‘<i8’)])
2.一串用逗号分隔的dtype规范
np.dtype(‘i8,f4,S3’)
dtype([(‘f0’, ‘<i8’), (‘f1’, ‘<f4’), (‘f2’, ‘S3’)])
np.dtype(‘3int8,float32,(2,3)float64’)
dtype([(‘f0’, ‘i1’, (3,)), (‘f1’, ‘<f4’), (‘f2’, ‘<f8’, (2, 3))])
3.字段参数数组字典
– names formats必填 offsets itemsize aligned titles可选
np.dtype({‘names’:[‘col1’,‘col2’],‘formats’:[‘i4’,‘f4’]})
dtype([(‘col1’, ‘<i4’), (‘col2’, ‘<f4’)])
dtype({‘names’:[‘col1’,‘col2’], ‘formats’:[’<i4’,’<f4’], ‘offsets’:[0,4], ‘itemsize’:12})np.dtype({‘names’😦‘col1’,‘col2’),‘format1s’😦‘i4’,‘f4’),‘offsets’:[0,4],‘itemsize’:12})
4.字段名称字典
np.dtype({‘col1’😦‘i1’,0),‘col2’😦‘f4’,1)})
dtype([(‘col1’, ‘i1’), (‘col2’, ‘<f4’)])
– 显示结构化数据类型
np.dtype({‘col1’😦‘i1’,0),‘col2’😦‘f4’,1)})
dtype([(‘col1’, ‘i1’), (‘col2’, ‘<f4’)])
– fields属性包括字段名 类型 和偏移量
np.dtype(‘u1,u1,i4,i8,u2’).fields
mappingproxy({‘f0’: (dtype(‘uint8’), 0), ‘f1’: (dtype(‘uint8’), 1), ‘f2’: (dtype(‘int32’), 2), ‘f3’: (dtype(‘int64’), 6), ‘f4’: (dtype(‘uint16’), 14)})
– d.fields[names][0]: dtype(‘name’) d.fields[names][1]: dtype(‘position’)
def print_offsets(d):
… print(‘offsets:’,[d.fields[name][1] for name in d.names])
… print(‘itemsize:’,d.itemsize)print_offsets(np.dtype(‘u1,u1,i4,i8,u2’))
offsets: [0, 1, 2, 6, 14]
itemsize: 16print_offsets(np.dtype(‘u1,u1,i4,i8,u2’,align=True))
offsets: [0, 1, 4, 8, 16]
itemsize: 24(np.dtype(‘u1,u1,i4,i8,u2’)).names
(‘f0’, ‘f1’, ‘f2’, ‘f3’, ‘f4’)
– 根据列名访问字段数据
x=np.array([(1,2),(3,4)],dtype=[(‘foo’,‘i8’),(‘bar’,‘f4’)])
x
array([(1, 2.), (3, 4.)], dtype=[(‘foo’, ‘<i8’), (‘bar’, ‘<f4’)])x[‘foo’]
array([1, 3], dtype=int64)
x=np.array([(1,2,3)],dtype=‘i,f,f’)
x
array([(1, 2., 3.)], dtype=[(‘f0’, ‘<i4’), (‘f1’, ‘<f4’), (‘f2’, ‘<f4’)])scalar=x[0]
scalar
(1, 2., 3.)type(scalar)
<class ‘numpy.void’>x.shape
(1,)x=np.array([(1,2,3)],dtype=‘i,f,f’)
x
array([(1, 2., 3.)], dtype=[(‘f0’, ‘<i4’), (‘f1’, ‘<f4’), (‘f2’, ‘<f4’)])x.shape
(1,)x=np.array([(1,2,3)],dtype=‘i,f,f’)[0]
x[0]
1x[1]=4
x
(1, 4., 3.)x.item()
(1, 4.0, 3.0)type(x.item())
<class ‘tuple’>
– rec子类
recordarr = np.rec.array([(1,2,‘hello’),(2,3,‘world’)],dtype=[(‘foo’,‘i4’),(‘bar’,‘f4’),(‘baz’,‘S10’)])
recordarr.bar
array([2., 3.], dtype=float32)recordarr[1:2]
rec.array([(2, 3., b’world’)],
dtype=[(‘foo’, ‘<i4’), (‘bar’, ‘<f4’), (‘baz’, ‘S10’)])recordarr[1:2].foo
array([2])recordarr.foo[1:2]
array([2])
– 与上面做对比
record = np.array([(1,2,‘hello’),(2,3,‘world’)],dtype=[(‘foo’,‘i4’),(‘bar’,‘f4’),(‘baz’,‘S10’)])
record[‘bar’]
array([2., 3.], dtype=float32)record[1:2]
array([(2, 3., b’world’)],
dtype=[(‘foo’, ‘<i4’), (‘bar’, ‘<f4’), (‘baz’, ‘S10’)])record[1:2][‘foo’]
array([2])
– 用忆存在的array对像初始化rec对像
recordxrr = np.rec.array(record)
recordxrr
rec.array([(1, 2., b’hello’), (2, 3., b’world’)],
dtype=[(‘foo’, ‘<i4’), (‘bar’, ‘<f4’), (‘baz’, ‘S10’)])
https://numpy.org/doc/stable/user/basics.rec.html