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

标签 python python-3.x numpy python-unicode

我正在尝试加载 /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/

相关文章:

python - 在当前窗口上进行 python 自动化

python - 从 redshift 存储过程返回结果集

python - 指示输入类型的 Django 表单

python - Pandas 数据帧 : adding columns based on previous time periods

Python - 对风险的边际贡献

python - 从满足 pandas 条件的行中获取下一个值

python - Keras 带有每次迭代更新的 Activity_regularizer

python - 值错误 : cannot reindex from a duplicate axis when assigning new column to pandas DataFrame

python - 使用 Python 进行傅里叶变换

python - 如何将一个小的 numpy 数组 "embed"变成一个大的 numpy 数组的预定义 block ?