我最近遇到了 numpy.savez 和 numpy.savez_compressed。两者似乎都适用于不同类型的数组,包括对象数组。但是,numpy.load 不适用于对象类型数组。例如:
import numpy as np
numbers = np.full((10, 1), np.pi)
strings = np.full((10, 1), "letters", dtype=object)
np.savez("test.npz", numbers=numbers, strings=strings)
data = np.load("test.npz")
调用
data["strings"]
会抛出以下 ValueError:
ValueError: Object arrays cannot be loaded when allow_pickle=False
但是,在
numpy.load
上启用 pickle 可以解决此问题。 numpy.savez
和numpy.savez_compressed
文档中没有讨论Pickling...这让我想知道为什么需要pickle来加载数据。 numpy.savez
和 numpy.savez_compressed
在幕后自动使用 pickle 吗?
一般情况下,会使用pickle模块。
在下面的源链接中查找“加载包含对象数组的文件使用
pickle
模块”。
https://github.com/numpy/numpy/blob/v1.26.0/numpy/lib/npyio.py#L555-L639