[英]Load Python 2 .npy file in Python 3
我正在嘗試加載/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
不一致有關,但不知道如何通過。
題:
.npy
文件(NumPy數據)? 問題是該文件包含序列化(pickled)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)
to array = pickle.load(fp, encoding="bytes")
。 更好的解決方案是允許numpy.load
傳遞編碼參數。
在使用numpy 1.10.4的python 3.5中,使用以下命令對我有用;
D = np.load(file, encoding = 'latin1')
當我沒有指定編碼時,它失敗並顯示相同的錯誤消息。
幫助我的一個解決方法是將python2。*中加載的numpy數組轉儲到csv文件中,然后在python3中讀取它。*
# Dump in python2
import numpy as np
datafile = matplotlib.cbook.get_sample_data('goog.npy', asfileobj=False)
arr = np.load(datafile)
np.savetxt("np_arr.csv", arr, delimiter=",")
現在在python3中讀回文件
# Load in python3
import numpy as np
arr = np.loadtxt(open("np_arr.csv"), delimiter=",")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.