您正在保存一组数组。
看看两个具有相同形状的数组的简单情况会发生什么:
In [763]: np.save('test.npy',(np.arange(3), np.ones(3)))
In [764]: np.load('test.npy')
Out[764]:
array([[0., 1., 2.],
[1., 1., 1.]])
我取回了一个数组 - 它从元组中创建了一个数组并保存了它。
如果数组的形状不同,我仍然会得到一个数组,但它是 object dtype。我收到警告(在足够新的 numpy 版本中):
In [765]: np.save('test.npy',(np.arange(3), np.ones(4)))
/usr/local/lib/python3.8/dist-packages/numpy/lib/npyio.py:528: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
arr = np.asanyarray(arr)
In [766]: np.load('test.npy')
Traceback (most recent call last):
File "<ipython-input-766-aeaca1f70e0f>", line 1, in <module>
np.load('test.npy')
File "/usr/local/lib/python3.8/dist-packages/numpy/lib/npyio.py", line 440, in load
return format.read_array(fid, allow_pickle=allow_pickle,
File "/usr/local/lib/python3.8/dist-packages/numpy/lib/format.py", line 743, in read_array
raise ValueError("Object arrays cannot be loaded when "
ValueError: Object arrays cannot be loaded when allow_pickle=False
In [767]: np.load('test.npy',allow_pickle=True)
Out[767]: array([array([0, 1, 2]), array([1., 1., 1., 1.])], dtype=object)
np.save 对于编写数字多维数组非常有效。但是该数组有objects,它使用pickle 将其转换为可以保存的字符串。这还不错,因为对数组执行pickle 实际上使用与np.save 相同的核心代码。
有一个 np.savez 将数组保存到单独的 npy 文件中,并将它们合并到一个 zip 存档中。
但是对于多种项目组合 - 数组、列表、标量、字符串等,pickle 可能是最简单和“最有效”的。但是您不能零碎地保存或加载项目。它不是数据库。