代码之家  ›  专栏  ›  技术社区  ›  geani

np.load失败,返回ValueError:无法将大小为(838715,)的数组重塑为形状(838710,)

  •  0
  • geani  · 技术社区  · 11 月前

    我试图将数据集的缩放参数保存到磁盘上的.npy文件中,这样我就不必每次重新运行代码时都重新计算它们。

    目前,我使用的是MaxAbsScaler() sklearn 我保存了定标器的 max_abs_ 房地产a .npy 文件以及要处理到另一个文件的剩余文件列表 .npy 文件,这样我就可以从上次保存的状态继续运行代码。 我正在处理的文件由一系列FFT幅度特征表示,我想在[-1,1]中缩放这些特征,为此我需要应用 partial_fit() 因为它们的总大小超过了我的RAM。 此外,我在代码中根本不使用.reshape。

    问题是: 有时(并非总是如此),当我运行计算缩放器的代码时,我会遇到标题中建议的错误。

    在将剩余的文件列表保存到磁盘之前,我试图输出它的长度,以查看发生了什么,但是,尽管我本以为会发生这种情况,但似乎没有差异。

    然后,我试图将我的列表转换为np数组,但我一直面临同样的错误。

    无法真正分享背后的相关逻辑,因为它是私人的,但长话短说,它类似于:

    remaining_paths = np.load('remaining_files.npy', allow_pickle=True)
    list_of_paths = remaining_paths
    for path in list_of_paths:
        data = np.load(path,allow_pickle=True)
        scaler.partial_fit(data)
        remaining_paths.remove(path)
        np.save(scaler.max_abs_,'max_abs.npy',allow_pickle=True)
        remaining_paths.remove(path)
        np.save(remaining_paths ,'remaining_files.npy',allow_pickle=True)
    
    1 回复  |  直到 11 月前
        1
  •  1
  •   benczejrobert    11 月前

    我自己也有同样的问题,当谈到错误的清晰度时,np.load有时很有趣。在我的情况下,这是因为文件损坏/进程在写入文件时中断。

    简短的回答是:

    尝试有一个备份文件或类似的文件:一个输入文件和一个输出文件。写入输出文件后,用其内容覆盖输入文件——可能每5步左右执行一次。

    remaining_paths = np.load('remaining_files.npy', allow_pickle=True)
    list_of_paths = remaining_paths
    ctr = 0
    steps_to_save = 5 
    for path in list_of_paths:
        data = np.load(path,allow_pickle=True)
        scaler.partial_fit(data)
        remaining_paths.remove(path)
        np.save(scaler.max_abs_,'max_abs.npy',allow_pickle=True)
        remaining_paths.remove(path)
        np.save(remaining_paths ,'remaining_files_out.npy',allow_pickle=True)
        if i % steps_to_save == 0: 
                shutil.copyfile('remaining_files_out.npy','remaining_files_in.npy')
        ctr+=1  
    

    你可以参考 shutil documentation this answer 关于不同类型的文件复制/移动/覆盖选项。

    答案很长:

    如果你深入挖掘np.load的代码,它将尝试将输入数组重塑为 .npy 文件。

    如果你想要一个hotfix -这可能有效,也可能无效,具体取决于文件编写器停止的位置:使用十六进制编辑器 like this 并用错误中的其他值更改文件中的任何值。在我的例子中,它是839915到839910,如图所示: Hex editor

    同样,只有当你足够幸运,文件的其余部分写得正确,只有形状有误时,这才有效,但我不建议这样做——谁知道数据会以什么其他方式损坏,但仍然可读?

    请参阅npy格式文档,了解npy文件如何构建/结构化的更多详细信息。 https://numpy.org/devdocs/reference/generated/numpy.lib.format.html