从文件读取NumPy向量列表时出现向量转为字符串的问题
解决NumPy向量写入文件后读取为字符串的问题
我懂你遇到的麻烦了——把生成的NumPy 0-1向量写入文件后,读回来居然变成字符串数组了,完全不是预期的数值型向量对吧?这问题出在写入和读取时的格式不匹配,咱们一步步来解决。
问题根源
你写入文件时用了"{}\n".format(i),这会把每个NumPy向量转成类似[0 1 0 1 0]的字符串。但读取时直接np.asarray(line.strip()),会把整个字符串拆成单个字符(比如['[', '0', ' ', '1', ...]),自然就变成字符串类型了。
解决方案
这里给你三种可行的方法,按推荐程度排序:
方法1:用NumPy原生读写函数(最推荐)
NumPy自带的np.savetxt和np.loadtxt专门处理数组的文件读写,既简洁又不容易出错:
修改写入代码
filepath = 'vectors.txt' rows = 10 dim = 5 V = np.random.choice(np.array([0, 1], dtype=np.uint8), size=(rows, dim)) M = np.unique(V.view(V.dtype.descr * dim)) Matrix = M.view(V.dtype).reshape(-1, dim) # 用savetxt写入,指定格式为无符号整数,逗号分隔 np.savetxt(filepath, Matrix, fmt='%u', delimiter=',')
读取代码
# 直接用loadtxt读取,指定数据类型和分隔符 contents = np.loadtxt(filepath, dtype=np.uint8, delimiter=',')
这样contents直接就是和原Matrix一样的二维NumPy数组,不用手动循环处理。
方法2:自定义逗号分隔格式写入/读取
如果不想用NumPy原生函数,可以手动把向量转成逗号分隔的字符串,读取时再拆分转换:
修改写入代码
with open(filepath, 'w') as f: for i in Matrix: # 把向量元素转成字符串后用逗号连接 f.write(','.join(map(str, i)) + '\n') # 这里不需要手动f.close(),with语句会自动处理
读取代码
with open(filepath, "r") as f: contents = [] for line in f: # 去掉换行符,按逗号拆分字符串,转成整数后再转成NumPy数组 num_list = list(map(int, line.strip().split(','))) contents.append(np.array(num_list, dtype=np.uint8)) # 可选:把列表转成二维NumPy数组 contents = np.array(contents)
方法3:兼容原写入格式(不推荐)
如果你坚持保留原写入的[0 1 0 ...]格式,那读取时需要先清理字符串格式:
读取代码
with open(filepath, "r") as f: contents = [] for line in f: # 去掉首尾的方括号和换行,按空格拆分(处理多个空格的情况) cleaned_line = line.strip().strip('[]') num_list = list(map(int, cleaned_line.split())) contents.append(np.array(num_list, dtype=np.uint8))
这种方法容易因为格式变化出问题,比如如果向量里有其他符号就会报错,所以还是优先前两种方法。
内容的提问来源于stack exchange,提问作者Medo
相关产品推荐
相关产品推荐

