pickle无法pickle包的对象(pyimfit)。TypeError:[…]无法转换为Python对象进行酸洗

2024-06-13 18:41:14 发布

您现在位置:Python中文网/ 问答频道 /正文

问题

我使用pyimfit包来拟合galaxy图像。我想把它们存储在硬盘上,所以我试着用pickle。但是附加的代码给了我一个错误。你知道吗

文件“/home/myusername/PycharmProjects/Master/FitContainer.py文件“,第56行,保存” pickle.dump公司(赛尔夫,f,pickle.u协议) 文件“stringsource”,第2行,inpyimfit.pyimfit\库.ModelObjectWrapper.减少\u cython TypeError:self.\u fitErrorsVect,self.\u fitResult,self.\u model,self.\u modelFluxes,self.\u paramVect,self.\u solverResults不能转换为Python对象进行酸洗

有办法解决这个问题吗?我想到的另一种方法是,通过将Imfit类中需要的属性存储在字典或类似的数据类型中,只从Imfit类中获取一些属性,但我最初的目标是通过将对象直接存储在Container类中来存储尽可能多的信息,从而使结构变得干净和简单。你知道吗

附加信息

应该注意的是,代码给了我

文件“/home/myusername/anaconda3/lib/python3.7/site-packages/pyimfit/描述.py“,第1039行,在getattr 返回self.\u函数集[0][attr] TypeError:'FunctionSetDescription'对象不可订阅

以前。因为我认为这应该是(非常新的)模块的一个bug,所以我注释掉了SimpleModelDescription类的getattr方法。再次运行代码会给我第一条错误消息。据我所知,如果我注释掉getattr它应该使用内置的python方法从这个类中获取属性,如果我正确地解释了第一条错误消息,这应该可以正常工作,问题实际上在于包的底层C库的python包装器。你知道吗

直接酸洗SimpleModelDescription类(而不是容器类)会导致相同的错误消息.wra你知道吗

代码

import pickle
import pyimfit
import numpy as np


class TestContainer:
    # class for storing previously fitted images
    def __init__(self, fitter):
        self.fitter = fitter

    def save(self, path):
        with open(path, 'wb') as f:
            pickle.dump(self, f, pickle.HIGHEST_PROTOCOL)


def sersic(x0, y0, PA, ell, I_e, r_e, n):
    # define pyimfit ModelDescription instance
    model = pyimfit.SimpleModelDescription()
    bulge = pyimfit.make_imfit_function('Sersic', label='bulge')
    model.addFunction(bulge)
    return model


image = 1e6 * np.ones((150, 150))   # just random image to perform fit on
test_model = sersic(75, 75, 0, 0.5, 1e6, 20, 1.3)   # dummy ModelDescription

fitter = pyimfit.Imfit(test_model)  # create Imfit instance
fitter.loadData(image)              # load image which is to be fitted
fitter.doFit(solver='LM')    # perform fit with Levenberg-Marquard algorithm

test_container = TestContainer(fitter)  # create container class instance
# save with pickle to ./test.pkl. Here: TypeError
test_container.save('test.pkl')

Tags: 文件对象方法代码testimageselfmodel