在大量重复的python函数中创建列表

2024-06-17 18:20:55 发布

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

我对python相当陌生,尤其是在类属性和它们的工作方式方面。我遇到过这样一个问题:我有一个函数“builddata”,它输出几个int的列表(粗粒化),并将其发送给另一个函数“粗粒化”。你知道吗

在脚本的粗化过程中,这些函数被调用了数百次,每次粗化都是不同的。我想做的是:

a)每次粗粒化达到“粗粒化”时,它都会使用该实例,但也会将其保存到一个更大的列表中,在多次重复该函数后,该列表将包含许多不同的粗粒化配置,然后可以稍后使用。你知道吗

b)在其他地方定义这个过程,粗粒化被发送到两个函数,在一个函数中完成它的常规过程,但是也被配置到这个所谓的列表列表中,然后可以使用它。你知道吗

我还应该提到,所有这些函数都是在同一个类“MultiFitter”中定义的。出于简单的原因,我更喜欢方法a),但任何可能的解决方案都会很好。下面是我所说内容的一个小摘录。你知道吗

干杯

class MultiFitter(object):

  def __init__(
    self, models, mopt=None, ratio=False, fast=True, extend=False,
        fitname=None, wavg_svdcut=None, **fitterargs
    ):
    super(MultiFitter, self).__init__()
    models = [models] if isinstance(models, MultiFitterModel) else models
    self.models = models
    self.fit = None         # last fit
    self.ratio = ratio
    self.mopt = mopt
    self.fast = fast
    self.extend = extend
    self.wavg_svdcut = wavg_svdcut       
    self.fitterargs = fitterargs        
    self.fitname = (
        fitname if fitname is not None else
        lambda x : x
        )

  def builddata(self, data=None, pdata=None, prior=None, mf=None):        
    if mf is None:
        mf = self._get_mf()
        mf['flatmodels'] = self.flatten_models(mf['models'])
    if pdata is None:
        if data is None:
            raise ValueError('no data or pdata')
        pdata = gvar.BufferDict()
        for m in mf['flatmodels']:

            M = m.builddata(data)
            CoarseGraining = []
            c1 = 1
            c2 = 0
            for i in range(1, M.shape[0]):                  
                z = gvar.evalcorr([M[c2],M[i]])
                corrValue = z[1][0]                
                if corrValue >= 0.7:
                    c1 = c1 + 1                                              
                    if i == M.shape[0]-1:                            
                        CoarseGraining.append(int(c1))                    
                else:
                    CoarseGraining.append(int(c1))                        
                    c2 = c2 + c1
                    c1 = 1
                    if i == M.shape[0]-1:                            
                        CoarseGraining.append(int(1))            
            pdata[m.datatag] = (
                m.builddata(data) if m.ncg <= 1 else                    
                MultiFitter.coarse_grain(m.builddata(data), CoarseGraining)
                )

  @staticmethod
  def coarse_grain(G, CoarseGraining):

    G = numpy.asarray(G)             
    D = []        
    counter = 0

    for i, ncg in enumerate(CoarseGraining):            
        D.append(str(numpy.sum(G[..., counter:counter + ncg], axis=-1) / ncg))       
        counter = counter + ncg

    D = numpy.asarray(D)
    print(array, 'IS THIS IT???')
    print(D ,'\n')
    #return numpy.transpose([G])
    return G

Tags: 函数selfnone列表dataifmodelscounter
1条回答
网友
1楼 · 发布于 2024-06-17 18:20:55

一种方法是使coarse_grain成为class MultiFitter的常规方法,并在类__init__中实例化full_list。然后附加到coarse_grain方法中的列表。你知道吗

然后可以通过self.full_list访问列表列表。你知道吗

def __init__(...):
    self.full_list = []

def coarse_grain(self, G, CoarseGraining):

    G = numpy.asarray(G)             
    D = []        
    counter = 0

    for i, ncg in enumerate(CoarseGraining):            
        D.append(str(numpy.sum(G[..., counter:counter + ncg], axis=-1) / ncg))       
        counter = counter + ncg

    D = numpy.asarray(D)

    self.full_list.append(D)    

    return G

相关问题 更多 >