Python 2와 3 사이의 numpy 어레이의 피클 비호환성
다음 프로그램을 사용하여 Python 3.2에 연결된 MNIST 데이터 세트를 로드하려고 합니다.
import pickle
import gzip
import numpy
with gzip.open('mnist.pkl.gz', 'rb') as f:
l = list(pickle.load(f))
print(l)
유감스럽게도 다음과 같은 오류가 발생합니다.
Traceback (most recent call last):
File "mnist.py", line 7, in <module>
train_set, valid_set, test_set = pickle.load(f)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)
그런 다음 Python 2.7에서 피클된 파일을 디코딩하고 다시 인코딩하려고 했습니다.Python 2.7에서 이 프로그램을 실행했습니다.
import pickle
import gzip
import numpy
with gzip.open('mnist.pkl.gz', 'rb') as f:
train_set, valid_set, test_set = pickle.load(f)
# Printing out the three objects reveals that they are
# all pairs containing numpy arrays.
with gzip.open('mnistx.pkl.gz', 'wb') as g:
pickle.dump(
(train_set, valid_set, test_set),
g,
protocol=2) # I also tried protocol 0.
오류 없이 실행되었기 때문에 이 프로그램을 파이썬 3.2에서 다시 실행했습니다.
import pickle
import gzip
import numpy
# note the filename change
with gzip.open('mnistx.pkl.gz', 'rb') as f:
l = list(pickle.load(f))
print(l)
하지만 이전과 같은 오류가 발생했습니다.이걸 어떻게 작동시키죠?
이 방법은 MNIST 데이터 세트를 로드하는 데 더 나은 방법입니다.
python3에서 이 오류가 발생하면 python2와 python3 사이의 비호환성 문제일 수 있습니다. 저에게 해결책은 다음과 같았습니다.load
와 함께latin1
인코딩:
pickle.load(file, encoding='latin1')
이것은 일종의 비호환성처럼 보입니다.이것은 "빈 문자열" 개체를 로드하려고 하는데, 이 개체는 ASCII로 가정되며, 이 경우에는 이진 데이터입니다.이것이 파이썬 3 언피커의 버그인지, 아니면 피커를 numpy에 의해 "오용"한 것인지 모르겠습니다.
해결 방법은 다음과 같습니다. 하지만 이 시점에서 데이터가 얼마나 의미가 있는지 모르겠습니다.
import pickle
import gzip
import numpy
with open('mnist.pkl', 'rb') as f:
u = pickle._Unpickler(f)
u.encoding = 'latin1'
p = u.load()
print(p)
Python 2에서 선택을 해제한 후 다시 선택하면 동일한 문제만 다시 발생하므로 다른 형식으로 저장해야 합니다.
Python 2와 Python 3 간의 비호환성 문제인 것 같습니다.MNIST 데이터 세트를 로드하려고 했습니다.
train_set, valid_set, test_set = pickle.load(file, encoding='iso-8859-1')
Python 3.5.2에서 작동했습니다.
유니코드로의 이동으로 인해 2.x와 3.x 사이의 피클에 호환성 문제가 있는 것 같습니다.당신의 파일은 python 2.x로 피클된 것으로 보이며 3.x에서 디코딩하는 것은 문제가 될 수 있습니다.
python 2.x를 사용하여 선택을 해제하고 사용 중인 두 버전에서 더 잘 재생되는 형식으로 저장하는 것이 좋습니다.
저는 방금 이 토막글을 우연히 발견했습니다.호환성 문제를 명확히 하는 데 도움이 되기를 바랍니다.
import sys
with gzip.open('mnist.pkl.gz', 'rb') as f:
if sys.version_info.major > 2:
train_set, valid_set, test_set = pickle.load(f, encoding='latin1')
else:
train_set, valid_set, test_set = pickle.load(f)
시도:
l = list(pickle.load(f, encoding='bytes')) #if you are loading image data or
l = list(pickle.load(f, encoding='latin1')) #if you are loading text data
의 문서에서.pickle.load
방법:
선택적 키워드 인수는 fix_imports, encoding 및 errors이며, 이는 Python 2에서 생성된 피클 스트림에 대한 호환성 지원을 제어하는 데 사용됩니다.
fix_imports가 True이면 피클은 이전 Python 2 이름을 Python 3에서 사용된 새 이름에 매핑하려고 시도합니다.
인코딩 및 오류는 Python 2에 의해 피킹된 8비트 문자열 인스턴스를 디코딩하는 방법을 피클에 알려줍니다. 이러한 인스턴스는 각각 'ASCII' 및 'strict'로 기본 설정됩니다.인코딩은 이러한 8비트 문자열 인스턴스를 바이트 개체로 읽기 위해 'bytes'가 될 수 있습니다.
피클보다 빠르고 쉬운 히클이 있습니다.저는 피클 덤프에 저장하고 읽으려고 했지만, 읽는 동안 많은 문제가 있었고, 챗봇을 만들기 위해 제가 직접 데이터를 작성하고 있었음에도 불구하고 한 시간을 허비하고 여전히 해결책을 찾지 못했습니다.
vec_x
그리고.vec_y
배열numpy 열배:
data=[vec_x,vec_y]
hkl.dump( data, 'new_data_file.hkl' )
그런 다음 이 문서를 읽고 다음 작업을 수행합니다.
data2 = hkl.load( 'new_data_file.hkl' )
언급URL : https://stackoverflow.com/questions/11305790/pickle-incompatibility-of-numpy-arrays-between-python-2-and-3
'sourcecode' 카테고리의 다른 글
데이터 프레임에 사전 추가 (0) | 2023.05.04 |
---|---|
fatal: 올바른 개체 이름이 아닙니다. 'master' (0) | 2023.05.04 |
필요한 경우 UAC 관리자 권한에서 요청하도록 배치 파일을 자동으로 승격하려면 어떻게 해야 합니까? (0) | 2023.05.04 |
pgAdmin을 사용하여 Postgresql 테이블 데이터 내보내기 (0) | 2023.05.04 |
Git에서 이클립스로 메이븐 프로젝트 가져오기 (0) | 2023.05.04 |