2016-11-10 18 views
0

即:如何`np.loads()`np.save()`d數組?

>>> 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()成功,所以我知道的數據不會受到損壞:

回答

1

我建議用np.savenp.load堅持,除非有一些額外的功能你需要的醃菜。然後直接使用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格式自身的負荷。查看它的文檔中關於醃漬對象的說明。並添加到混亂。數組使用np.save。也就是說,ndarray的pickle格式是save

所以有np.loadnp.loads之間的關係,但並不完全一樣pickle.loadpickle.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]) 

使用鹹菜接口來保存和加載陣列:

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]) 
0

這可以作爲一個變通現在:

>>> np.load(io.BytesIO(open('zomg.npy', 'rb').read())) 
array([1, 2, 3])