Day 05-结构化数组-灵析社区

野生程序员在线

本节内容:

1、结构化数据类型

2、字段访问

一、结构化数据类型

结构化数据类型可以被认为是一定长度的字节序列(结构的项大小),它被解释为字段的集合。 每个字段在结构中都有一个名称、一个数据类型和一个字节偏移量。 字段的数据类型可以是任何 numpy 数据类型

可以使用函数 numpy.dtype 创建结构化数据类型,有 4 种替代形式的规范,它们的灵活性和简洁性各不相同:

1.1、元组列表

元组列表,每个字段一个元组。每个元组都具有 (fieldname, datatype, shape) 形式,其中 shape 是可选的

np.dtype([('x', 'f4'), ('y', np.float32), ('z', 'f4', (2, 2))])
# dtype([('x', '<f4'), ('y', '<f4'), ('z', '<f4', (2, 2))])

#如果 fieldname 是空字符串 '',则该字段将被赋予 f# 形式的默认名称
np.dtype([('x', 'f4'), ('', 'i4'), ('z', 'i8')])
# dtype([('x', '<f4'), ('f1', '<i4'), ('z', '<i8')])

1.2、一串以逗号分隔的 dtype 规格

在这个速记符号中,任何字符串 dtype 规范都可以在字符串中使用并用逗号分隔,并且字段名称被赋予默认名称 f0、f1 等

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

1.3、字段参数数组字典

该字典有两个必需键,“名称”和“格式”,‘

  • names’ 和 ‘formats’ 的值应分别是相同长度的字段名称列表和 dtype 规范列表
  • 可选的“偏移”值应该是整数字节偏移列表,结构中的每个字段一个。 如果未给出“偏移量”,则自动确定偏移量。 可选的“itemsize”值应该是一个整数,以字节为单位描述 dtype 的总大小,它必须足够大以包含所有字段
np.dtype({'names': ['col1', 'col2'], 'formats': ['i4', 'f4']})
# dtype([('col1', '<i4'), ('col2', '<f4')])
np.dtype({'names': ['col1', 'col2'],
          'formats': ['i4', 'f4'],
          'offsets': [0, 4],
          'itemsize': 12})
# dtype({'names': ['col1', 'col2'], 'formats': ['<i4', '<f4'],
# 'offsets': [0, 4], 'itemsize': 12})

1.4、字段名称字典

字典的键是字段名,值是指定类型和偏移量的元组:

np.dtype({'col1': ('i1', 0), 'col2': ('f4', 1)})
# dtype([('col1', 'i1'), ('col2', '<f4')])

二、字段访问

如果 ndarray 对象是结构化数组,则可以通过使用字符串索引数组来访问数组的字段,类似于字典

对结构化数组的索引也可以通过字段名称列表来完成,例如 x[['field-name1', 'field-name2']]

如果访问的字段是子数组,则子数组的维度将附加到结果的形状中。 例如:

2.1、访问单个字段

x = np.zeros((2, 2), dtype=[('a', np.int32),
                            ('b', np.float64, (3, 3))
                           ])
x
'''
array([[(0, [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]]),
        (0, [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])],
       [(0, [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]]),
        (0, [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])]],
      dtype=[('a', '<i4'), ('b', '<f8', (3, 3))])
'''

x['a'].shape
# (2, 2)
x['a'].dtype
# dtype('int32')
x['b'].shape
# (2, 2, 3, 3)
x['b'].dtype
# dtype('float64')

d = np.dtype([('x', 'i8'), ('y', 'f4')])
d.names
#('x', 'y')
d.fields

2.2、访问多个字段

可以索引并分配给具有多字段索引的结构化数组,其中索引是字段名称列表。

a = np.zeros(3, dtype=[('a', 'i4'), ('b', 'i4'), ('c', 'f4')])
a[['a', 'c']]
array([(0, 0.), (0, 0.), (0, 0.)],
     dtype={'names':['a','c'], 'formats':['<i4','<f4'], 'offsets':[0,8], 'itemsize':12})


阅读量:2012

点赞量:0

收藏量:0