在python中使用两个条件删除多个列表

在python中使用两个条件删除多个列表,python,Python,我有两个列表,其中包含一些图像像素值及其“测量值”。如果满足两个条件,我会尝试从中删除项目。在意识到我愚蠢的错误之前,我试着用for循环在它上面循环。我的代码如下。有什么方法可以做到这一点 for i in range(100): delete_chance = np.random.random() if abs(measurements[i]) == 0.15 and delete_chance < 0.70: del images[i]

我有两个列表,其中包含一些图像像素值及其“测量值”。如果满足两个条件,我会尝试从中删除项目。在意识到我愚蠢的错误之前,我试着用for循环在它上面循环。我的代码如下。有什么方法可以做到这一点

for i in range(100):
    delete_chance = np.random.random()
    if abs(measurements[i]) == 0.15 and delete_chance < 0.70:
        del images[i]
        del measurements[i]
范围(100)内的i的
:
delete_chance=np.random.random()
如果abs(测量值[i])==0.15且删除概率<0.70:
del图像[i]
del测量[i]
尝试筛选:

z = zip(*list(filter(lambda x: x[1] != 0.15 or np.random.random() >= 0.7, zip(measurements, images))))
measurements = list(z[0])
images = list(z[1])

您可以按相反的顺序进行迭代:

for i in range(99, -1, -1):
    delete_chance = np.random.random()
    if abs(measurements[i]) == 0.15 and delete_chance < 0.70:
        del images[i]
        del measurements[i]
范围(99,-1,-1)内的i的
:
delete_chance=np.random.random()
如果abs(测量值[i])==0.15且删除概率<0.70:
del图像[i]
del测量[i]

列表理解有助于:

filtered_images, filtered_measurements = zip(*[(i, m) for i, m in zip(images, measurements) if math.isclose(abs(m), 0.15) and random.random() < 0.7])

首先,您不应该直接比较两个浮点数,您应该使用接受合理错误的函数(epsilon)来比较它们

其次,首先构建一个迭代器,该迭代器为要删除的任何元素返回
True

t = [np.random.random() < 0.7 and np.isclose(abs(measurements[i]), 0.15) for i in range(100)]

什么是愚蠢的错误?为什么这段代码不起作用,它应该做什么呢?如果你只是在
反向(范围(100))
上迭代,它实际上是安全的。不管你最终使用什么解决方案,你都应该消除浮点相等比较。有一个用于浮点比较的特殊函数,请查找它。您正在使用
图像中的值作为
测量值的索引。我认为这行不通。相反,试着压缩
图像
测量值
。几乎达到了我想要的效果。但这似乎在随机下采样时掩盖了所有其他值。我想保留这些价值观。我该怎么做呢?我不明白你在问什么。你的numpy代码生成的输出屏蔽了除abs(0.15)以外的所有值。我想减少abs(0.15)值的数量,但我想保留列表中存在的所有其他值。你是说
已删除\u images=images[~mask]
?答对了!非常感谢。
t = [np.random.random() < 0.7 and np.isclose(abs(measurements[i]), 0.15) for i in range(100)]
measurments = [m for m,b in zip(measurments,t) if not b]
images = [m for m,b in zip(images,t) if not b)]