我对python很陌生,特别是在类属性及其工作原理方面。我遇到过这个问题,我有一个函数'builddata',它输出几个整数的列表(Coarsegraining),并将其发送到另一个函数'coarse_grain'。
在粗略的脚本中,这些函数被调用数百次,每次CoarseGraining都不同。我想做的是:
a)每次CoarseGraining达到'coarse_grain'时它都使用该实例,但也将它保存到一个更大的列表中,该函数经过多次重复后,将包含许多这些不同的CoarseGraining配置,然后可以稍后使用。
b)在其他地方定义这个过程,其中CoarseGraining被发送到2个函数,在那里它通过其常规过程中的一个,但是也被配置到这个所谓的列表列表中,然后可以使用它。 / p>
我还要提一下,所有这些函数都在同一个类'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
答案 0 :(得分:0)
一种方法是使coarse_grain
成为class MultiFitter
的常规方法,并在您的班级full_list
中实例化__init__
。然后在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