我正在尝试加载 /usr/share/matplotlib/sample_data/goog.npy
:
datafile = matplotlib.cbook.get_sample_data('goog.npy', asfileobj=False)
np.load(datafile)
在 Python 2.7 中没问题,但在 Python 3.4 中引发异常:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd4 in position 1: ordinal not in range(128)
我认为它与 Python 2 和 3 之间的 bytes/str/unicode
不一致有关,但不知道如何解决。
问题:
- 如何在 Python 3 中从 Python 2 加载
.npy
文件(NumPy 数据)?
最佳答案
问题在于该文件包含序列化(腌制)的 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."
和
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)
解决方法是在 Numpy 代码内部进行更改
numpy/lib/format.py:
...
446 array = pickle.load(fp)
到 array = pickle.load(fp, encoding="bytes")
。更好的解决方案是允许 numpy.load
传递编码参数。
关于python - 在 Python 3 中加载 Python 2 .npy 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24105148/