Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3如何知道如何pickle扩展类型,尤其是Numpy数组?_Python_Python 3.x_Numpy_Pickle_Python C Api - Fatal编程技术网

Python3如何知道如何pickle扩展类型,尤其是Numpy数组?

Python3如何知道如何pickle扩展类型,尤其是Numpy数组?,python,python-3.x,numpy,pickle,python-c-api,Python,Python 3.x,Numpy,Pickle,Python C Api,Numpy数组作为扩展类型(即使用C API中的扩展定义的数组),声明Python解释器范围之外的其他字段(例如,数据属性,它是一种缓冲区结构,如Numpy中所述。 为了能够对其进行序列化,Python 2使用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu函数作为pickle协议的一部分,如中所述,并进行了说明 但是,即使Python 3中仍然存在\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

Numpy数组作为扩展类型(即使用C API中的扩展定义的数组),声明Python解释器范围之外的其他字段(例如,
数据
属性,它是一种
缓冲区结构
,如Numpy中所述。
为了能够对其进行序列化,Python 2使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
函数作为pickle协议的一部分,如中所述,并进行了说明


但是,即使Python 3中仍然存在
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
此外,还有其他与酸洗扩展类型相关的条目:

  • ,被描述为扩展类型的Pickle接口构造函数注册,但是在copyreg模块本身中没有提到扩展类型
  • 它为Python3发布了一个新的缓冲协议(并且可能会自动为这个缓冲协议进行酸洗)
  • 新样式类:可以假设新样式类对酸洗过程有影响
那么,所有这些与Numpy阵列的关系如何:

  • Numpy数组是否实现了特殊的方法,例如
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
  • Numpy是否使用了Python的C-API结构,这些结构是Pickle开箱即用支持的(比如新的
    缓冲协议
    ),所以Pickle Numpy数组不需要任何补充

  • Python3
    pickle
    尽管如此,它还是包含在下面

    Numpy的支持在这方面没有改变;它在数组上实现
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    以支持Python 2或3中的pickle:

    >>> import numpy
    >>> numpy.array(0).__reduce__()
    (<built-in function _reconstruct>, (<class 'numpy.ndarray'>, (0,), b'b'), (1, (), dtype('int64'), False, b'\x00\x00\x00\x00\x00\x00\x00\x00'))
    
    导入numpy >>>numpy.array(0)。\uuuu reduce\uuu() (,(,(0,),b'b'),(1,(),数据类型('int64'),False,b'\x00\x00\x00\x00\x00\x00\x00'))

    返回一个三元素元组,由一个用于重新创建值的函数对象、一个用于该函数的参数元组和一个用于传递no
    newinstance的状态元组组成

    \uuuuuuuuuuuuuuuuuuuuuuuuu
    在Python3中仍然存在……问题是
    reduce
    文档中对扩展类型的提及已经被删除,即使
    reduce
    仍然存在。但正如公认的答案(以及下面的注释)所述,这仍然是真的。那么中所说的仍然是真的吗?为什么他们要将
    \uuu reduce\uuuu
    文档从
    扩展类型
    移动到更一般的
    类实例
    部分?@Phylliade:是的,一切仍然是真的。该方法不是扩展类型独有的(而且自定义Python类和扩展类型之间的界限在很大程度上已经模糊了)。@Phylliade:
    \uuuuu reduce\uuuu
    是较低级别的复制协议实现;自定义Python类应该实现更高级别的方法(
    \uuuuu getnewargs\u ex\uuuuu
    /
    \uu getstate\uuuuu
    /
    \uu setstate\uuu
    )如果可能,一个默认的
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    实现将使用这些。