【问题标题】:unable to get length of items in .npy file无法获取 .npy 文件中项目的长度
【发布时间】:2021-12-21 21:27:44
【问题描述】:

我有一个 .npy 文件here

它只是一个包含图像及其标签列表的对象的文件。例如:

{
'2007_002760': array([0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.,0., 0., 0.], dtype=float32), 
'2008_004036': array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0.,0., 0., 0.], dtype=float32)
}

我想打开文件并获取它的长度,然后可能会添加或修改它

我可以打开文件,但无法获取其中项目的长度。 这是我打开它的方法:

import numpy as np
file = np.load('cls_labels.npy', allow_pickle = True)
print(file.size)

我在这里错过了什么?

【问题讨论】:

  • 它对我来说很好用。它声称是一个大小为 16458x20 的数组。你期待什么结果?
  • 啊,我放错链接了。立即尝试
  • NPY 文件格式旨在表示一个数组。看起来您没有数组或图像列表及其标签。看起来你有一个带有字符串键和数组值的字典。
  • 如果你想序列化一个dict,你应该使用pickle,而不是numpy.savenumpy.load

标签: python numpy object numpy-ndarray


【解决方案1】:

您的文件包含一个包装在 0 维 numpy 对象中的字典。提取实际信息的神奇之处在于:

my_dictionary = file[()]

这是一个标准字典,其键是 '2008_004036' 之类的字符串,其值是 numpy 数组。


编辑:如上所述,您不应该使用numpy.save() 保存字典,您应该使用pickle。你最终会遇到像file[()] 这样的恐怖。

【讨论】:

  • np.save/loadpickle 有很多相互作用。包含objects 的数组使用它们的pickle,而save 是数组pickle 机制。并且使用[()](或item)从0d 数组中提取对象并不是那么尴尬或丑陋(IMO)。使用np.load,您不必单独打开文件(就像使用pickle 一样),因此在某些方面它实际上更容易。
【解决方案2】:

这是正确且最简单的方法:

cls_labels = np.load('cls_labels.npy', allow_pickle = True).item()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2021-07-25
    • 2011-06-09
    • 1970-01-01
    • 2015-05-11
    相关资源
    最近更新 更多