You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Numpy加载存储字典对象的二维数组的.txt文件?

解决Numpy加载字典数组时字符串转字典的问题

直接修复当前加载问题

你用np.savetxt保存时,字典被转成字符串形式存储,加载后得到的是字符串数组。可以用ast.literal_eval安全地将每个字符串转回字典:

import numpy as np
import ast

# 加载文本文件中的字符串数组
loaded_strings = np.loadtxt('grid_data.txt', dtype=str)
# 逐元素解析为字典,再转回numpy数组
grid_data = np.array([[ast.literal_eval(cell) for cell in row] for row in loaded_strings], dtype=object)

ast.literal_eval专门用于解析Python字面量(比如字典、列表),比eval更安全,不会执行任意代码。

更优的存储方案(推荐)

用np.savetxt存储字典数组本质是将对象转为字符串,容易出现格式问题且效率低,更推荐以下两种方式:

1. Pickle序列化(最适合复杂对象)

Pickle可以直接保存和加载包含字典的numpy数组,无需额外转换:

import numpy as np
import pickle

# 保存数组
with open('grid_data.pkl', 'wb') as f:
    pickle.dump(grid_data, f)

# 加载数组
with open('grid_data.pkl', 'rb') as f:
    grid_data = pickle.load(f)

优点:速度快,完整保留数组结构和对象类型,适合游戏场景的大量数据存储。

2. JSON存储(适合可序列化数据)

如果你的字典仅包含字符串、数字、列表等JSON支持的类型,用JSON存储可读性更强,且跨语言兼容:

import json
import numpy as np

# 保存:将numpy数组转为列表后写入JSON
with open('grid_data.json', 'w') as f:
    json.dump(grid_data.tolist(), f)

# 加载:读取列表后转回numpy数组
with open('grid_data.json', 'r') as f:
    grid_data = np.array(json.load(f), dtype=object)

优点:文件为纯文本,可手动编辑,适合需要查看或修改存储内容的场景。

为什么np.savetxt不适合?

np.savetxt原本是为数值型数组设计的,当你指定fmt="%s"时,它只是调用字典的__str__方法将其转为字符串,加载时无法还原为原字典对象。对于包含复杂对象的数组,Pickle或JSON是更合适的选择。

内容的提问来源于stack exchange,提问作者MineMoebsie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:09:59