如何 `np.loads()` 一个 `np.save()`d 数组?
How to `np.loads()` an `np.save()`d array?
也就是说:
>>> foo = np.array([1, 2, 3])
>>> np.save('zomg.npy', foo)
>>> np.load('zomg.npy')
array([1, 2, 3])
一切顺利。 loads
呢?
>>> np.loads(open('zomg.npy', 'rb').read())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
_pickle.UnpicklingError: STACK_GLOBAL requires str
没有。这不应该工作吗? np.load()
成功,所以我知道数据没有损坏:
目前这是一种变通方法:
>>> np.load(io.BytesIO(open('zomg.npy', 'rb').read()))
array([1, 2, 3])
我建议坚持使用 np.save
和 np.load
,除非您需要 pickle 的一些额外功能。那么直接使用 pickle
而不是通过 np
同义词之一使用可能会更容易混淆。
============
有一个未记录的np.loads
; pickle.loads
.
的另一个名称
In [573]: np.loads
Out[573]: <function _pickle.loads>
In [574]: np.loads??
Signature: np.loads(data, *, fix_imports=True, encoding='ASCII', errors='strict')
np.ma.loads
有更多文档,但只是:
def loads(strg):
...
return pickle.loads(strg)
np.load
将使用 pickle
来处理不是常规数组的内容,但会从 np.save
格式执行自己的加载。查看其文档中关于腌制对象的内容。并增加混乱。数组的 pickle.dump
使用 np.save
。也就是说,ndarray
的 pickle 格式是 save
.
所以np.load
和np.loads
是有关系的,但是和pickle.load
和pickle.loads
不完全一样。
================
没有np.dumps
,但是有np.ma.dumps
In [584]: d=np.ma.dumps(foo)
In [585]: d
Out[585]: b'\x80\x03cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nndarray\nq\x01K\x00\x85q\x02C\x01bq\x03\x87q\x04Rq\x05(K\x01K\x03\x85q\x06cnumpy\ndtype\nq\x07X\x02\x00\x00\x00i4q\x08K\x00K\x01\x87q\tRq\n(K\x03X\x01\x00\x00\x00<q\x0bNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x0cb\x89C\x0c\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00q\rtq\x0eb.'
In [586]: np.loads(d)
Out[586]: array([1, 2, 3])
In [587]: np.ma.loads(d)
Out[587]: array([1, 2, 3])
In [588]: import pickle
In [589]: pickle.loads(d)
Out[589]: array([1, 2, 3])
使用 pickle 接口保存和加载数组:
In [594]: np.ma.dump(foo,open('test.pkl','wb'))
In [595]: np.load('test.pkl')
Out[595]: array([1, 2, 3])
In [600]: pickle.load(open('test.pkl','rb'))
Out[600]: array([1, 2, 3])
也就是说:
>>> foo = np.array([1, 2, 3])
>>> np.save('zomg.npy', foo)
>>> np.load('zomg.npy')
array([1, 2, 3])
一切顺利。 loads
呢?
>>> np.loads(open('zomg.npy', 'rb').read())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
_pickle.UnpicklingError: STACK_GLOBAL requires str
没有。这不应该工作吗? np.load()
成功,所以我知道数据没有损坏:
目前这是一种变通方法:
>>> np.load(io.BytesIO(open('zomg.npy', 'rb').read()))
array([1, 2, 3])
我建议坚持使用 np.save
和 np.load
,除非您需要 pickle 的一些额外功能。那么直接使用 pickle
而不是通过 np
同义词之一使用可能会更容易混淆。
============
有一个未记录的np.loads
; pickle.loads
.
In [573]: np.loads
Out[573]: <function _pickle.loads>
In [574]: np.loads??
Signature: np.loads(data, *, fix_imports=True, encoding='ASCII', errors='strict')
np.ma.loads
有更多文档,但只是:
def loads(strg):
...
return pickle.loads(strg)
np.load
将使用 pickle
来处理不是常规数组的内容,但会从 np.save
格式执行自己的加载。查看其文档中关于腌制对象的内容。并增加混乱。数组的 pickle.dump
使用 np.save
。也就是说,ndarray
的 pickle 格式是 save
.
所以np.load
和np.loads
是有关系的,但是和pickle.load
和pickle.loads
不完全一样。
================
没有np.dumps
,但是有np.ma.dumps
In [584]: d=np.ma.dumps(foo)
In [585]: d
Out[585]: b'\x80\x03cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nndarray\nq\x01K\x00\x85q\x02C\x01bq\x03\x87q\x04Rq\x05(K\x01K\x03\x85q\x06cnumpy\ndtype\nq\x07X\x02\x00\x00\x00i4q\x08K\x00K\x01\x87q\tRq\n(K\x03X\x01\x00\x00\x00<q\x0bNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x0cb\x89C\x0c\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00q\rtq\x0eb.'
In [586]: np.loads(d)
Out[586]: array([1, 2, 3])
In [587]: np.ma.loads(d)
Out[587]: array([1, 2, 3])
In [588]: import pickle
In [589]: pickle.loads(d)
Out[589]: array([1, 2, 3])
使用 pickle 接口保存和加载数组:
In [594]: np.ma.dump(foo,open('test.pkl','wb'))
In [595]: np.load('test.pkl')
Out[595]: array([1, 2, 3])
In [600]: pickle.load(open('test.pkl','rb'))
Out[600]: array([1, 2, 3])