如何将CSV导出的3D数组字符串还原为numpy三维数组
如何还原CSV中存储的3D Numpy数组字符串?
我之前也踩过这个坑!直接用str()把Numpy数组转成字符串存CSV,读出来后用ast.literal_eval肯定会报错——因为Numpy打印出来的字符串格式根本不是合法的Python列表字面量,比如你看到的[[[205 60 145],元素之间是空格而不是逗号,还有换行,这都会让语法解析失败。
问题根源
当你执行str(np_array)时,得到的是Numpy的控制台打印格式:元素用空格分隔,多行显示,这和Python要求的列表字面量(元素用逗号分隔)完全不匹配,所以ast.literal_eval会抛出语法错误。
两种可行的解决方案
方案1:用Numpy原生方法直接解析
不需要依赖ast,直接处理字符串后让Numpy解析,前提是你记得数组的原始形状:
import numpy as np # 模拟从CSV读取的字符串 my_string_array = str(np.random.randint(0, high=255, size=(51, 52, 3))) # 第一步:清理字符串——去掉换行,把连续空格换成单个空格,再把元素间的空格换成逗号 cleaned = my_string_array.replace('\n', '').replace(' ', ' ').strip() cleaned = cleaned.replace(' ', ',') # 解析成一维数组,再reshape回原形状 my_array = np.fromstring(cleaned[1:-1], sep=',').reshape(51, 52, 3)
这里cleaned[1:-1]是去掉字符串首尾的外层括号,让fromstring能正确识别元素。
方案2:修复格式后用ast.literal_eval
如果你不想记形状,可以先把字符串改成合法的Python列表格式,再用ast解析:
import ast import numpy as np import re my_string_array = str(np.random.randint(0, high=255, size=(51, 52, 3))) # 先去掉所有换行 cleaned = my_string_array.replace('\n', '') # 用正则精准替换:只把数字/右括号后面、数字/左括号前面的空格换成逗号 cleaned = re.sub(r'(?<=[0-9\]])\s+(?=[0-9\[])', ',', cleaned) # 现在可以正常解析了 my_list = ast.literal_eval(cleaned) my_array = np.array(my_list)
正则的作用是避免把括号之间的空格也换成逗号(比如]] [[变成]],[[),保证格式完全符合Python列表语法。
从根源避免这个问题
以后再存Numpy数组到CSV,别用str()了,两种更稳妥的方式:
- 转成嵌套列表再保存:
# 保存时 df['image_column'] = df['image_column'].apply(lambda arr: arr.tolist()) df.to_csv('your_data.csv', index=False) # 读取时 df['image_column'] = df['image_column'].apply(lambda s: np.array(ast.literal_eval(s))) - 更高效的方式:用
np.save单独存每个数组,CSV里只存数组文件的路径,读取时直接np.load路径对应的文件,完全不会有格式问题。
内容的提问来源于stack exchange,提问作者Razmik Melikbekyan
相关产品推荐
相关产品推荐

