Ошибка травления Python: TypeError: рассол объекта не возвращает список

Я знаю, если этот очень старый вопрос Ошибка травления Python: TypeError: рассол объекта не возвращает список. Проблема с numpy?, но единственный данный ответ довольно неясен.

Это код, который воспроизводит проблему в Python 3.6.

import pickle
from astroquery.irsa import Irsa
from astropy import units as u

# Query region.
table = Irsa.query_region("m31", catalog="fp_psc", spatial="Cone",
                          radius=.5 * u.arcmin)

# Dump table.
with open('table.pkl', 'wb') as f:
    pickle.dump(table, f)

# This is where the issue appears.
with open('table.pkl', 'rb') as f:
    table = pickle.load(f)

При попытке загрузить маринованные данные происходит сбой:

Traceback (most recent call last):
  File "/home/gabriel/Descargas/test.py", line 17, in <module>
    table2 = pickle.load(f)
  File "/home/gabriel/anaconda3/envs/cat-match/lib/python3.6/site-packages/astropy/table/column.py", line 238, in __setstate__
    super_class.__setstate__(self, state)
  File "/home/gabriel/anaconda3/envs/cat-match/lib/python3.6/site-packages/numpy/ma/core.py", line 5869, in __setstate__
    super(MaskedArray, self).__setstate__((shp, typ, isf, raw))
TypeError: object pickle not returning list

Как я могу обойти это?


Используя conda, вы можете установить требования в среде Python 3 с помощью:

conda install astropy
conda install -c astropy astroquery

person Gabriel    schedule 06.03.2017    source источник
comment
Есть ли трассировка стека? Может быть, проблему можно сузить до более простого случая (распаковать меньшую вещь, чем целая таблица), а затем обойти?   -  person 9000    schedule 06.03.2017
comment
Помогите мне, под трассировкой стека вы подразумеваете полную трассировку (здесь не программист)?   -  person Gabriel    schedule 06.03.2017
comment
Да, длинный список строк, ведущих к ошибке.   -  person 9000    schedule 06.03.2017
comment
Какие версии numpy и astropy.   -  person    schedule 06.03.2017


Ответы (1)


В связанном ответе упоминаются замаскированные массивы numpy, вызывающие проблемы при их распаковке. Учитывая, что в таблицах astropy действительно могут быть замаскированные записи (не каждый объект или позиция могут иметь значение, например, для каждой полосы или любых соответствующих столбцов), это действительно может быть источником вашей проблемы: замаскированные массивы.

Обманщики проблем с numpy также показывают эту проблему: Замаскированный массив с типом объекта dtype не распаковывается . И это, кажется, решено в запросе на включение 8122.

Просмотр примечаний к выпуску для Numpy 1.12.0 показывает этот запрос на вытягивание. Поэтому, если вы уже не используете numpy 1.12, возможно, стоит обновить numpy.

person Community    schedule 06.03.2017
comment
Я использую astropy v1.3 и numpy v1.11.3. По какой-то причине установка astropy понижает numpy с 1.12 до этой версии. Я понял это сегодня утром и открыл вопрос: github.com/conda/conda/issues/4817. - person Gabriel; 06.03.2017
comment
@Gabriel Я предполагаю, что Conda использует жестко запрограммированную зависимость (судя по имени пакета), и я предполагаю, что это потому, что все их пакеты были протестированы на numpy 1.11. Действительно, в дистрибутиве Conda могут быть другие пакеты, которые не могут работать с Numpy 1.12 (хотя маловероятно). Numpy 1.12 появился довольно недавно (как и Astropy 1.13), поэтому у них, возможно, не было времени полностью протестировать Numpy 1.12. - person ; 07.03.2017
comment
(продолжение) Таким образом, Conda должна быть стабильной средой (вместо установки самых последних лучших пакетов), но может пропустить самые последние исправления ошибок. (Очевидно, массивы с маской рассола либо не считаются ошибкой, либо следующий выпуск исправления ошибок для серии 1.11 Numpy все еще должен появиться.) - person ; 07.03.2017