我使用python3来筛选包含文本关键字的字典,或使用整数dtype的scipy.sparse.lil_matrix (链表)。
该文件是跨平台(在安装了python3、scipy和numpy的机器上)吗?
只包含文本和numpy数组的酸洗字典是否跨平台?
酸菜是跨平台的:Is pickle file of python cross-platform?
Is numpy.save cross platform?的.npy文件格式是跨平台的:numpy ...
不确定如果我手动酸洗一个numpy数组会发生什么。我在两台安装了英特尔cpu的不同机器上检查了一个整数数组,它们的值保持不变。
手动酸洗numpy数组:
import numpy as np
import pickle
x = np.random.randint(0, 2**63 - 1, dtype=np.int32)
d = {
'x': x,
'blah': "blah blah blah"
}
with open('bomb.pickle', 'wb+') as f:
pickle.dump(d, f)发布于 2017-07-30 02:52:15
如果我们不需要修复导入,则手动酸洗整数dtype的numpy数组。
这是因为如果一个对象有一个reduce方法,pickle就会使用它。
numpy.ndarray.__reduce__的文档https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray..html
“numpy ndarray是如何被腌制的”没有引用源代码:How does Python 3 know how to pickle extension types, especially Numpy arrays?
在祖先时代,使用协议0的酸洗是不可移植的浮点数的,NaN,Inf:https://mail.python.org/pipermail/tutor/2010-May/075980.html
使用文本协议的Python3.1上关于酸洗浮标的官方文档:https://docs.python.org/3/whatsnew/3.1.html
新算法依赖于底层浮点实现中的某些功能。如果找不到所需的功能,则将继续使用旧算法。此外,text pickle协议通过使用旧算法来确保跨平台可移植性。
numpy用于写入文件的源代码是用format.write_array和npyio.save编写的
(https://github.com/numpy/numpy/blob/v1.13.0/numpy/lib/format.py,https://github.com/numpy/numpy/blob/v1.13.0/numpy/lib/npyio.py#L435-L512)
页眉可以另存为文本。如果酸洗参数为真,那么数据就是一个pickle.dump,这是numpy.save的默认值。在format.write_array中,我发现:
数组pickle.dump(
,fp,protocol=2,**pickle_kwargs)
format.py还说:
.npy格式是NumPy中用于在磁盘上持久存储单个任意NumPy数组的标准二进制文件格式。该格式存储了正确重建数组所需的所有形状和数据类型信息,即使在具有不同体系结构的另一台机器上也是如此。
所以手动酸洗numpy数组是跨平台的(如果我们不需要修复导入的话),因为np.save也使用酸洗并且是跨平台的。
np.save使用协议2,两台机器上的两个python 3的pickle.DEFAULT_PROTOCOL为3。
https://stackoverflow.com/questions/45392667
复制相似问题