【问题标题】:Python 3 numpy.load() until End of FilePython 3 numpy.load() 直到文件结束
【发布时间】:2020-10-17 04:04:26
【问题描述】:

假设我正在生成一个需要序列化的随机数组

def generator():
    num = 0
    while num < random.randint(0, 10):
        yield np.array(range(2))
        num += 1


with open('out.npy', 'wb') as f:
    for item in generator():
        np.save(f, item)

现在我怎么知道我需要np.load() 多少次才能取回所有数组? np.load() 最终会抛出异常所以我想出了

with open('out.npy', 'rb') as f:
    try:
        while 1:
            item = np.load(f)
            print(item)
    except:
        print("EoF")

但我想知道是否有一种方法可以检测文件结束,或者只是一种更好的方法来做到这一点。

【问题讨论】:

  • 您正在使用 np.save/load 的未记录功能。没有任何东西可以记录您串在一起的阵列数量。阅读直到你得到一个EOF异常是非常好的Python。但是你应该改进你的except 子句,这样它就可以抓住它。并做一些事情来收集所有这些item 数组。
  • @hpaulj 是的,这只是说明问题的示例代码。实际上,我按照numpy.save 的最后一个示例进行了保存/加载,但发现自己处于此用例中,我不知道实际保存项目的数量。顺便说一句,在耗尽每个元素后引发的异常是ValueError: Cannot load file containing pickled data when allow_pickle=False
  • 如果np.load(f, allow_pickle=True) 你得到EOFError
  • 您的通用 except 隐藏了此 ValueError,这与您的 EOF 无关。您的一个或多个数组被保存为 object dtype,可能是因为它不是一个开始的数组,或者包含不同大小的列表/数组。
  • @hpaulj 没有人,引发 ValueError 的代码是您在问题中看到的代码。可能会引发 ValueError ,因为它已经用尽了它试图读取无法读取的内容的每个项目。您可以自己尝试代码,不会花费那么长时间。

标签: python python-3.x numpy serialization deserialization


【解决方案1】:

您是否尝试过以下操作?

data = np.load('out.npy')

参考:https://numpy.org/doc/stable/reference/generated/numpy.load.html

【讨论】:

  • 是的,它只加载第一个数组。我按照numpy.save 的最后一个示例进行操作,根据该示例,您每次想要获取下一个元素时都必须np.load()
  • 我有点困惑。您首先要保存的数组是什么,如下所示:[array([0, 1]), array([0, 1]), array([0, 1]), array([0, 1]), array([0, 1])] OP 代码中保存到 out.py 的内容与调用np.save('out.py', data)时保存的内容大不相同@
  • 正如我所说,这就像我发布的链接的最后一个示例,它在打开的文件中一次保存一个数组。我需要的唯一修改是要保存的数组是随机数量(并且由生成器产生,但这并不重要)。简而言之,如果您要保存分配的数组列表,您的代码将起作用,但这不是我的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 2021-08-02
  • 2011-07-02
  • 2017-09-30
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多