shape为(1200,2)的object类型numpy数组存CSV遇阻求助
问题分析与解决方案
首先得明确:你的数组是嵌套了二维uint8数组和列表的object类型数组,这种复杂结构本来就不适合用CSV直接存储——CSV是为扁平的表格数据设计的,而np.savetxt和默认的pandas.to_csv都没法直接处理这种嵌套结构,这就是你遇到问题的核心原因。
为什么两种方法都失败?
- np.savetxt报错:这个函数是为数值型数组设计的,默认会用科学计数法格式符(
%.18e)来格式化每个元素,但你的元素是嵌套数组和列表,根本没法转成单个数值,所以直接抛出类型不匹配的错误。 - pandas存后读格式异常:
to_csv会把所有非基本类型的元素转成字符串保存(比如把二维数组转成类似[[30,29,...]]的字符串),读取时这些字符串会被原样读回来,而不是自动还原成数组/列表,所以会出现数字无逗号、列表换行的混乱情况。
解决方案
方案1:优先用二进制格式存储(推荐)
如果不需要用文本编辑器查看数据,只是为了保存后能正确还原,直接用numpy或pickle的二进制存储方式,这是最省心的:
用numpy的save/load
# 保存 np.save('my_complex_array.npy', arr) # 加载 loaded_arr = np.load('my_complex_array.npy', allow_pickle=True)
加载后的数组和原数组完全一致,包括嵌套的结构和数据类型。
用pickle
import pickle # 保存 with open('my_data.pkl', 'wb') as f: pickle.dump(arr, f) # 加载 with open('my_data.pkl', 'rb') as f: loaded_data = pickle.load(f)
pickle支持几乎所有Python对象的序列化,同样能完美还原你的数据。
方案2:一定要存成CSV?先序列化嵌套结构
如果必须用CSV格式(比如要和其他非Python工具交互),需要先把嵌套的数组和列表序列化成标准字符串(比如JSON),读取时再反序列化回来:
import pandas as pd import json import numpy as np # 第一步:把嵌套结构转成JSON字符串 df = pd.DataFrame(arr) # 把二维uint8数组转成列表再转JSON df[0] = df[0].apply(lambda x: json.dumps(x.tolist())) # 把列表直接转JSON df[1] = df[1].apply(json.dumps) # 保存到CSV df.to_csv('my_data.csv', index=False) # 第二步:读取时还原结构 loaded_df = pd.read_csv('my_data.csv') # 把JSON字符串转回二维uint8数组 loaded_df[0] = loaded_df[0].apply(lambda x: np.array(json.loads(x), dtype=np.uint8)) # 把JSON字符串转回列表 loaded_df[1] = loaded_df[1].apply(json.loads) # 还原成原numpy数组格式 loaded_arr = loaded_df.to_numpy(dtype=object)
这样处理后,读取的数据就能和原数据结构完全一致了。
总结
CSV不是存储复杂嵌套数据的最佳选择,除非有硬性要求,否则优先用二进制格式(npy/pickle),既高效又不会有格式转换的麻烦。
内容的提问来源于stack exchange,提问作者jundo
相关产品推荐
相关产品推荐

