如何创建无dtype名称、存储数值的numpy记录数组
解决numpy recarray匹配HDF5子数组dtype的问题
问题核心在于:直接用('u1', (3,))作为recarray的dtype时,numpy会将其解析为长度3的字节串类型(dtype('V3')),而非包含3个uint8元素的子数组字段。要让recarray存储uint8数值,需要正确定义结构化dtype,即使字段没有名称。
正确实现代码
import numpy as np # 定义无名称的结构化dtype,对应HDF5的子数组类型 dt = np.dtype([('', 'u1', (3,))]) # 创建目标recarray records = np.recarray((2,), dtype=dt) # 验证类型匹配度 print(records.dtype) # 输出: dtype([('', 'u1', (3,))]) print(records[0].dtype) # 输出: dtype('uint8') # 赋值测试 records[0] = [10, 20, 30] print(records[0]) # 输出: [10 20 30]
原方法失效原因
当你传递('u1', (3,))给np.recarray的dtype参数时,numpy会将其识别为灵活类型(flexible type),也就是字节串(V3),这类类型会以字节形式展示,而非数值。
而用[('', 'u1', (3,))]的列表形式定义dtype时,numpy会将其解析为结构化dtype中的一个字段,这个字段的类型是长度为3的uint8子数组,这样recarray就能正确存储和展示uint8数值,同时字段名称为空字符串,完美匹配原HDF5数据集无名称的dtype。
额外提示
如果不需要recarray的属性访问能力,直接使用普通numpy数组会更简洁:
arr = np.zeros((2, 3), dtype='u1')
但如果必须使用recarray,上述结构化dtype的定义方式是最优解。
内容的提问来源于stack exchange,提问作者Stephen Hartzell
相关产品推荐
相关产品推荐

