簡體   English   中英

如何`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.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格式執行其自身的加載。 查看其文檔關於腌制對象的說法。 並增加了混亂。 pickle.dump陣列的使用np.save 也就是說, save ndarray的pickle格式。

因此,有之間的關系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])

使用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])

目前,這是一種變通方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM