2015-04-17 2 views
2

Невозможно загрузить массивы numpy структурированных массивов, сохраненных в python3, в python2, потому что имена полей являются строками unicode.Загрузка структурированного массива numpy, сохраненного в python3 в python2

$ python3 
Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
>>> a = np.zeros(4, dtype=[('x',int)]) 
>>> np.save('a.npy', {'a': a}) 
>>> 
$ python2 
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
>>> np.load('a.npy') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 393, in load 
    return format.read_array(fid) 
    File "/usr/local/lib/python2.7/dist-packages/numpy/lib/format.py", line 602, in read_array 
array = pickle.load(fp) 
ValueError: non-string names in Numpy dtype unpickling 

Это была ошибка NumPy в течение некоторого времени: https://github.com/numpy/numpy/issues/2407

Кто-нибудь есть работа вокруг, чтобы иметь возможность загружать NumPy структурированные массивы из Python3 в python2 (без необходимости загрузки и повторно сохранить в python3)?

+2

Вы столкнулись с этой проблемой из-за странного способа сохранения массива. Почему словарь '{'a': a}'? Если вы используете 'np.save ('a.npy', a)' он загружается отлично в Python 2. Если это потому, что вам нравится хранить несколько массивов в одном файле, вы действительно должны использовать 'np.savez'. –

+1

Да, я пытался хранить несколько массивов в одном файле. Теперь я перешел на 'np.savez' – jmlarson

ответ

1

Я не думаю, что это имя вопроса unicode.

В Python3 я могу сохранить object массив:

In [133]: b=np.array([[1],[1,2],[1,2,3]]) 
In [134]: np.save('a.npy',b) 
In [135]: np.load('a.npy') 
Out[135]: array([[1], [1, 2], [1, 2, 3]], dtype=object) 

в python2

In [260]: np.load('a.npy') 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-260-76b2da2985df> in <module>() 
----> 1 np.load('a.npy') 

/usr/local/lib/python2.7/site-packages/numpy/lib/npyio.pyc in load(file, mmap_mode) 
    386     return format.open_memmap(file, mode=mmap_mode) 
    387    else: 
--> 388     return format.read_array(fid) 
    389   else: 
    390    # Try a pickle 

/usr/local/lib/python2.7/site-packages/numpy/lib/format.pyc in read_array(fp) 
    451  if dtype.hasobject: 
    452   # The array contained Python objects. We need to unpickle the data. 
--> 453   array = pickle.load(fp) 
    454  else: 
    455   if isfileobj(fp): 

TypeError: must be char, not unicode 

ошибка не совсем в том же месте, но она по-прежнему включает в себя pickle.load. Я получаю ту же ошибку, если я сохраню {'a':a}.

С словарной оболочкой, python3 load получает

array({'a': array([(0,), (0,), (0,), (0,)], 
     dtype=[('x', '<i4')])}, dtype=object) 

As moamingsun баллов из, если вы сохраните a массив без словаря обертки, нагрузка python2 работает отлично.

Проблема не с именами полей, а с травлением Python 3 v 2. np.save передает доллар до pickle, если он должен сохранять объекты Python. Я уверен, что совместимость py2 v 3 с травлением подробно обсуждается в другом месте.

Смежные вопросы