如何将包含NumPy数组的named tuple序列化到文件?
持久化含字符串与NumPy数组的named tuple列表的方法
针对你的需求,这里提供两种简单可靠的方案,直接上手就能用:
方案一:沿用你熟悉的NumPy序列化方式
因为numpy.save开启allow_pickle=True后支持序列化任意可pickle的Python对象,而named tuple本身是可pickle的,所以直接复用这个逻辑即可:
import numpy as np from collections import namedtuple # 定义named tuple Point = namedtuple('Address', 'city embedding') # 创建测试数据 point_list = [ Point(city="Beijing", embedding=np.arange(300)), Point(city="Shanghai", embedding=np.arange(200)) ] # 持久化到文件 np.save('points.npy', point_list, allow_pickle=True) # 重新加载 loaded_points = np.load('points.npy', allow_pickle=True) # 验证加载结果 print(loaded_points[0].city) # 输出 Beijing print(loaded_points[0].embedding.shape) # 输出 (300,)
方案二:使用Python原生pickle模块
如果需要更通用的Python对象序列化方案,原生pickle模块是更直接的选择:
import pickle import numpy as np from collections import namedtuple # 定义named tuple Point = namedtuple('Address', 'city embedding') # 创建测试数据 point_list = [ Point(city="Beijing", embedding=np.arange(300)), Point(city="Shanghai", embedding=np.arange(200)) ] # 持久化到文件 with open('points.pkl', 'wb') as f: pickle.dump(point_list, f, protocol=4) # 指定protocol提升跨版本兼容性 # 重新加载 with open('points.pkl', 'rb') as f: loaded_points = pickle.load(f) # 验证加载结果 print(loaded_points[1].city) # 输出 Shanghai print(loaded_points[1].embedding.shape) # 输出 (200,)
注意事项
- 加载数据时,当前运行环境必须提前定义好对应的named tuple(即
Point = namedtuple('Address', 'city embedding')),否则会触发反序列化错误。 - 如果需要在不同Python版本间共享数据,建议指定pickle协议版本(比如
protocol=4),避免兼容性问题。
内容的提问来源于stack exchange,提问作者Exploring
相关产品推荐
相关产品推荐

