gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:47:44 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com