簡體   English   中英

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

[英]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不一致有關,但不知道如何通過。

題:

  • 如何在Python 3中從Python 2加載.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM