【问题标题】:How to `np.loads()` an `np.save()`d array?如何`np.loads()`一个`np.save()`d数组?
【发布时间】:2016-11-10 01:42:55
【问题描述】:

也就是说:

>>> 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() 成功,所以我知道数据没有损坏:

【问题讨论】:

    标签: python python-3.x numpy serialization pickle


    【解决方案1】:

    我建议坚持使用np.savenp.load,除非您需要pickle 的一些额外功能。那么直接使用pickle 而不是通过np 同义词之一可能会更容易混淆。

    ============

    有一个未记录的np.loadspickle.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.loadpickle 用于非常规数组的内容,但会从 np.save 格式执行其自己的加载。看看它的文档是怎么说腌制物体的。并增加混乱。数组的pickle.dump 使用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])
    

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

    【讨论】:

      【解决方案2】:

      目前这是一种解决方法:

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

      【讨论】:

        猜你喜欢
        • 2022-01-27
        • 1970-01-01
        • 2020-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        相关资源
        最近更新 更多