跨程序读取CSV时如何还原数组列表的原始格式?
如何将CSV读取的Biases还原为原始数组列表格式?
我明白你的问题——你用NumPy生成了一个由二维数组组成的列表(biases),但存成CSV再读出来后,原来的数组结构就丢了,没法直接用。问题出在CSV是表格型的文本格式,它只能存储一维的行数据,没法保留多维数组的形状信息,所以我们需要在存储时做扁平化处理,读取时再把数据重新reshape回原来的结构。
下面给你两种解决方案,一种是基于CSV的(如果你必须用CSV存储),另一种是更简便的NumPy原生格式方案:
方案1:用CSV存储并还原
第一步:正确存储biases
存储时,我们需要把每个二维数组扁平化(转成一维),这样才能写入CSV的一行中。因为你已经知道sizes的结构,所以不需要额外存储形状信息,后面可以用sizes[1:]来推导每个数组的形状:
import csv import numpy as np sizes = [784, 30, 10] biases = [np.random.randn(y, 1) for y in sizes[1:]] # 存储:将每个bias数组扁平化后写入一行 with open('biases.csv', 'w', newline='') as f: writer = csv.writer(f) for b in biases: # 把二维数组转成一维列表写入 writer.writerow(b.flatten().tolist())
第二步:读取并还原原始格式
读取时,按行读取每一行的字符串数据,转成float数组后,再用sizes[1:]中的对应维度reshape回(y,1)的结构:
import csv import numpy as np sizes = [784, 30, 10] biases = [] with open('biases.csv', 'r') as f: reader = csv.reader(f) # 遍历每一行,对应一个原始的bias数组 for idx, row in enumerate(reader): # 把字符串转成float数组,再reshape回目标形状 flat_bias = np.array([float(val) for val in row]) original_bias = flat_bias.reshape(sizes[1:][idx], 1) biases.append(original_bias) # 验证形状是否正确 for b in biases: print(b.shape) # 输出应该是: # (30, 1) # (10, 1)
方案2:用NumPy原生格式存储(更推荐)
如果你不需要用CSV,建议直接用NumPy的.npz格式存储,它会自动保留数组的形状、数据类型等信息,操作更简单:
存储代码
import numpy as np sizes = [784, 30, 10] biases = [np.random.randn(y, 1) for y in sizes[1:]] # 用npz存储多个数组 np.savez('biases.npz', *biases)
读取还原代码
import numpy as np # 加载npz文件 loaded_data = np.load('biases.npz') # 按顺序取出数组,还原成原始列表 biases = [loaded_data[f'arr_{i}'] for i in range(len(loaded_data))] # 验证形状 for b in biases: print(b.shape)
这种方法完全不需要手动处理形状转换,适合存储NumPy数组的场景,避免了CSV的格式限制。
内容的提问来源于stack exchange,提问作者Sharath Talikatte
相关产品推荐
相关产品推荐

