我认为这是一个非常微妙的问题,也许是Python2.7中的未知错误。我正在制作一个交互式应用程序。它应该适合WLS(加权线性回归)模型到点云。在开始时,脚本从文本文件中读取数据(只是一个包含每个点的索引,值和错误的简单表)。但是在数据中可能是一些具有nocompl=99.9999
标记的NULL值的点。在剧本开始拟合之前,我必须知道哪些要点是拒绝它们的。我通过以下方式执行此操作:
# read the data from input file
Bunchlst = [Bunch(val1 = D[:,i], err_val1 = D[:,i+1], val2 = D[:,i+2], err_val2 = D[:,i+3]) for i in range(1, D.shape[1] - 1, 4)]
# here is the problem
for b in Bunchlst:
b.compl = list(np.logical_not([1 if nocompl in [im,ie,sm,se] else 0 for v1,e1,v2,e2 in zip(b.val1,b.err_val1,b.val2,b.err_val2)]))
# fit the model to the "good" points
wls = sm.WLS(list(compress(b.val1,b.compl)), sm.add_constant(list(compress(b.val2,b.compl)), prepend=False), weights=[1.0/i for i in list(compress(b.err_val2,b.compl))]).fit()
WLS model implemented in Python。compress()
允许过滤数据(省略NULL值)。但是这种情况会产生错误:
wls = sm.WLS(...)。fit() AttributeError:' numpy.float64'对象没有属性' WLS'
我进行了调查,当我只压缩两个列表时,问题就消失了,WLS模型正确计算了自己:
for b in Bunchlst:
b.compl = list(np.logical_not([1 if nocompl in [v1,v2] else 0 for v1,v2 in zip(b.val1,b.val2)]))
我写道,这可能是一个错误,因为我在两种情况下都检查了b.compl
。始终存在具有True
或False
值的相同列表(取决于输入文件中的数据)。此外,简单的考虑因素导致它必须适用于许多列表:
>>> K = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> L = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> M = [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
>>> N = [32, 33, 34, 35, 36, 37, 38, 39, 40, 32]
>>> [1 if 26 in [k,l,m,n] else 0 for k,l,m,n in zip(K,L,M,N)]
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
一切顺利,
Benek
答案 0 :(得分:1)
不,zip()
对2个或更多列表的操作方式没有区别。相反,您的列表推导分配给循环中的名称sm
,同时您使用名称sm
来引用statsmodels
模块。
您更简单的双列表版本不会这样做,因此名称sm
不会反弹,您也不会遇到此问题。
在Python 2中,列表推导中使用的名称是本地范围的一部分:
>>> foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
>>> [foo for foo in 'bar']
['b', 'a', 'r']
>>> foo
'r'
此处名称foo
已在列表推导的for
循环中设置,循环后名称仍然可用。
重命名导入,或重命名循环变量。