误存numpy数组致文件损坏,如何恢复被覆盖的int型数组?
NumPy数据误覆盖后的恢复方案
问题背景
我误将NumPy数组使用.tofile()而非.save()保存,加载时未指定dtype=int,默认以float类型读取,随后用该错误数据覆盖了原文件,原文件已丢失,仅存损坏的文件。尝试将数据转int或幂运算均无效,现寻求恢复方法。
正确操作示例
import numpy as np PATH = 'test.npy' x = np.array([[100, 200, 300], [400, 500, 600]]) print('x', x) x.tofile(PATH) # 注意此处指定了dtype=int y = np.fromfile(PATH, dtype=int) print('y', y) np.save(PATH, y) z = np.load(PATH) print('z', z)
正确输出
x [[100 200 300] [400 500 600]] y [100 200 300 400 500 600] z [100 200 300 400 500 600]
错误操作示例
import numpy as np PATH = 'test.npy' x = np.array([[100, 200, 300], [400, 500, 600]]) print('x', x) x.tofile(PATH) # 此处未指定dtype,默认以float读取 y = np.fromfile(PATH) print('y', y) np.save(PATH, y) z = np.load(PATH) print('z', z) print('z', z.astype(int))
错误输出
x [[100 200 300] [400 500 600]] y [4.941e-322 9.881e-322 1.482e-321 1.976e-321 2.470e-321 2.964e-321] z [4.941e-322 9.881e-322 1.482e-321 1.976e-321 2.470e-321 2.964e-321] z [0 0 0 0 0 0]
恢复方法
核心逻辑:损坏文件中的float数据,本质是把原int数据的二进制字节流错误解析成了float。我们只需要把这些float的二进制字节流提取出来,再用原int dtype重新解析即可。
恢复代码示例
import numpy as np # 加载损坏的文件 corrupted_arr = np.load('test.npy') # 提取float数组的二进制字节流 raw_bytes = corrupted_arr.tobytes() # 用原数据的dtype解析字节流,这里假设原数据是int32,根据实际情况调整(比如int64) recovered_arr = np.frombuffer(raw_bytes, dtype=np.int32) # 还原原数组的形状,示例中是(2,3),根据你的原始数组形状修改 recovered_arr = recovered_arr.reshape((2, 3)) print(recovered_arr)
关键注意事项
- 确定原数据的dtype:需要明确原数组的整数类型(如
np.int32、np.int64),如果不确定可以尝试常见类型,对比输出是否符合预期。 - 还原原数组形状:如果原数组是多维的,需要将恢复后的一维数组reshape回原来的维度。
内容的提问来源于stack exchange,提问作者user5618793
相关产品推荐
相关产品推荐

