在Python 3中加载Python 2 .npy文件

Fro*_*ame 12 python numpy python-3.x python-unicode

我正在尝试加载/usr/share/matplotlib/sample_data/goog.npy:

datafile = matplotlib.cbook.get_sample_data('goog.npy', asfileobj=False)
np.load(datafile)
Run Code Online (Sandbox Code Playgroud)

它在Python 2.7中很好,但在Python 3.4中引发了异常:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xd4 in position 1: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

我认为它与bytes/str/unicodePython 2和3之间的不一致有关,但不知道如何通过.

题:

  • 如何.npy从Python 3中的Python 2 加载文件(NumPy数据)?

pv.*_*pv. 6

问题在于该文件包含序列化(腌制)的Python日期时间对象,而不仅仅是数字数据。这些对象的Python序列化格式在Py2和Py3之间不兼容:

python2
>>> import pickle
>>> pickle.dumps(datetime.datetime.now())
"cdatetime\ndatetime\np0\n(S'\\x07\\xde\\x06\\t\\x0c\\r\\x19\\x0f\\x1fP'\np1\ntp2\nRp3\n."
Run Code Online (Sandbox Code Playgroud)

python3
>>> import pickle
>>> pickle.loads(b"cdatetime\ndatetime\np0\n(S'\\x07\\xde\\x06\\t\\x0c\\r\\x19\\x0f\x1fP'\np1\ntp2\nRp3\n.")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xde in position 1: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

解决方法是更改​​Numpy代码内部

numpy/lib/format.py:
...
446         array = pickle.load(fp)
Run Code Online (Sandbox Code Playgroud)

array = pickle.load(fp, encoding="bytes")。更好的解决方案是允许numpy.load传递编码参数。


PhA*_*ABC 5

在numpy 1.10.4的python 3.5中,使用以下命令对我有效;

D = np.load(file, encoding = 'latin1')
Run Code Online (Sandbox Code Playgroud)

当我不指定编码时,它将失败,并显示相同的错误消息。