zip两个和两个以上的列表有什么区别吗?

时间:2016-04-19 16:22:20

标签: python python-2.7 zip linear-regression

我认为这是一个非常微妙的问题,也许是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 Pythoncompress()允许过滤数据(省略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。始终存在具有TrueFalse值的相同列表(取决于输入文件中的数据)。此外,简单的考虑因素导致它必须适用于许多列表:

>>> 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

1 个答案:

答案 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循环中设置,循环后名称仍然可用。

重命名导入,或重命名循环变量。