You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

误存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)

关键注意事项

  1. 确定原数据的dtype:需要明确原数组的整数类型(如np.int32、np.int64),如果不确定可以尝试常见类型,对比输出是否符合预期。
  2. 还原原数组形状:如果原数组是多维的,需要将恢复后的一维数组reshape回原来的维度。

内容的提问来源于stack exchange,提问作者user5618793

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 10:00:56