有条件地删除相关列表中的项目

时间:2014-07-02 19:10:56

标签: python arrays list

两个列表:一个包含红移,另一个包含这些红移中的错误。我编写了一小段代码,成功检查了红移列表,从平均值中识别出高于三西格玛的值并删除它们然后重新计算平均值和标准偏差并重复此操作,直到上面列表中没有任何项目为止从平均值sigma。我的问题:我如何不仅从第一个列表中删除红移,还从第二个列表中删除相应的错误?我在下面尝试了这段代码,但我确定这是错的。我不确定怎么说"项目在z"在dz的条件语句中。请原谅我的草率代码。我确信有办法让它更简洁。

for item in z:
    if absolute(item - average(z)) > 3 * std(z):
        z = [item for item in z if absolute(item - average(z)) < 3 * std(z)]
        dz = [item for item in dz if absolute((item in z) - average(z)) < 3 * std(z)]

2 个答案:

答案 0 :(得分:0)

import numpy
z = numpy.array(z)
mask = [None]
while not all(mask): #loop until all elements of z are within 3 sigma
    mask = numpy.abs(z - numpy.average(z)) < 3 * numpy.std(z)
    z = z[mask]   # meets condition above
print z

numpy是你的朋友

答案 1 :(得分:0)

尝试重建z而你已经在迭代它时没有意义。而且,计算z的平均值和标准偏差这么多次效率非常低。一种直接的,基于索引的方法是:

z_ave = average(z)
z_std = std(z)

indices = set(index for index, item in enumerate(z) 
              if abs(item - z_ave) >= (3 * z_std))

z = [item for index, item in enumerate(z) if index not in indices]
dz = [item for index, item in enumerate(dz) if index not in indices]