numpy.load 获取 None 值会报错如何解决?

import numpy

limit = None

numpy.savez_compressed(
    '123.npz',
    limit=limit
)


d = numpy.load('123.npz')
limit = d.get('limit', None)

运行后报错

Traceback (most recent call last):
  File "/Users/ponponon/Desktop/code/me/ideaboom/main.py", line 12, in <module>
    limit = d.get('limit', None)
  File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/_collections_abc.py", line 824, in get
    return self[key]
  File "/Users/ponponon/.local/share/virtualenvs/ideaboom-B0dr_aXc/lib/python3.10/site-packages/numpy/lib/npyio.py", line 253, in __getitem__
    return format.read_array(bytes,
  File "/Users/ponponon/.local/share/virtualenvs/ideaboom-B0dr_aXc/lib/python3.10/site-packages/numpy/lib/format.py", line 787, in read_array
    raise ValueError("Object arrays cannot be loaded when "
ValueError: Object arrays cannot be loaded when allow_pickle=False
阅读 1.4k
1 个回答

解决了

这个错误提示是因为在调用 numpy.load() 函数时没有设置 allow_pickle=True 参数,而默认情况下 allow_pickle=False,这意味着 numpy.load() 函数不能加载包含 Python 对象(例如 None)的数组。为了解决这个问题,您需要将 allow_pickle=True 作为参数传递给 numpy.load() 函数,如下所示:

import numpy

limit = None

numpy.savez_compressed(
    '123.npz',
    limit=limit
)

d = numpy.load('123.npz', allow_pickle=True) # 添加 allow_pickle=True 参数
limit = d.get('limit', None)

在这个示例中,我们在调用 numpy.load() 函数时添加了 allow_pickle=True 参数,以允许加载包含 Python 对象的数组。这样,您就可以成功加载 limit 变量的值了。


Q:numpy.load 的 allow_pickle 参数是干嘛的?

A:allow_pickle 参数是 numpy.load() 函数的一个可选参数,用于指示是否允许加载包含 Python 对象的数组。默认情况下,allow_pickle 参数的值为 False,这意味着 numpy.load() 函数不能加载包含 Python 对象的数组。如果您的数组中包含 Python 对象(如 Python 内置类型 listdict,或自定义对象),则需要将 allow_pickle 参数设置为 True

allow_pickle=True 时,numpy.load() 函数会允许加载包含 Python 对象的数组。这将导致 numpy.load() 函数更加灵活,但也会带来一些潜在的风险,因为加载任意 Python 对象可能会导致恶意代码的执行。因此,建议只在需要加载包含 Python 对象的数组时使用 allow_pickle=True

在使用 allow_pickle=True 时,您需要确保只加载来自可信来源的数据,以避免潜在的安全问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题