[英]Python Generator expression: how to add AND conditions from a loop?
具有以下距离矩阵dist
:
dist = [[[ 0, 0],
[ 5, 0],
[ 1, 0],
[ 1, 1],
[11, 3],
[ 3, 6],
[ 5, 5]],
[[ 5, 0],
[ 0, 0],
[ 6, 0],
[ 4, 1],
[ 6, 3],
[ 2, 6],
[10, 5]],
[[ 1, 0],
[ 6, 0],
[ 0, 0],
[ 2, 1],
[12, 3],
[ 4, 6],
[ 4, 5]],
[[ 1, 1],
[ 4, 1],
[ 2, 1],
[ 0, 0],
[10, 2],
[ 2, 7],
[ 6, 6]],
[[11, 3],
[ 6, 3],
[12, 3],
[10, 2],
[ 0, 0],
[ 8, 9],
[16, 8]],
[[ 3, 6],
[ 2, 6],
[ 4, 6],
[ 2, 7],
[ 8, 9],
[ 0, 0],
[ 8, 1]],
[[ 5, 5],
[10, 5],
[ 4, 5],
[ 6, 6],
[16, 8],
[ 8, 1],
[ 0, 0]]]
我需要使用这样的AND
条件构建一个generator expression
:
gexp = (dist[:, :, 0] <= 1) & (dist[:, :, 1] <= 2)
这意味着当两个条件都成立时(对于第0列和第1列),我想要一个True
值,如下所示(我将其打印为移动到列表理解语法):
[array([[ True, False, True, True, False, False, False],
[False, True, False, False, False, False, False],
[ True, False, True, False, False, False, False],
[ True, False, False, True, False, False, False],
[False, False, False, False, True, False, False],
[False, False, False, False, False, True, False],
[False, False, False, False, False, False, True]])]
我有此列列表:
columns = ['weight', 'height']
他们的门槛:
thresholds = {'weight': 1.0, 'height': 1.0}
及其相应的索引:
indexes = {'weight': 0, 'height': 1}
我尝试以这种方式构建生成器表达式:
dynamic_gexpr = [dist[:,:,indexes.get(column)] <= thresholds.get(column) for column in columns]
但是我不知道如何在一列和另一列之间添加AND条件。 上面的表达式似乎像对待OR条件一样处理它,给出以下输出:
[array([[ True, False, True, True, False, False, False],
[False, True, False, False, False, False, False],
[ True, False, True, False, False, False, False],
[ True, False, False, True, False, False, False],
[False, False, False, False, True, False, False],
[False, False, False, False, False, True, False],
[False, False, False, False, False, False, True]]), array([[ True, True, True, True, False, False, False],
[ True, True, True, True, False, False, False],
[ True, True, True, True, False, False, False],
[ True, True, True, True, False, False, False],
[False, False, False, False, True, False, False],
[False, False, False, False, False, True, True],
[False, False, False, False, False, True, True]])]
我使用列表推导来应用构建生成器的条件,反之亦然。 无论如何,不确定是否要这样做。
x = ([second[0] <= 1 and second[1] <=2 for second in first] for first in dist)
for y in x:
print(y)
输出:
[True, False, True, True, False, False, False]
[False, True, False, False, False, False, False]
[True, False, True, False, False, False, False]
[True, False, False, True, False, False, False]
[False, False, False, False, True, False, False]
[False, False, False, False, False, True, False]
[False, False, False, False, False, False, True]
对于版本,感觉错了,以防您想要什么
x = ((second[0] <= 1 and second[1] <=2 for second in first) for first in dist)
for y in x:
print([next(y),next(y),next(y),next(y),next(y),next(y),next(y)])
输出相同
现在编写一个单独的函数进行比较
def compare(a,b):
return all([a[i] <= b[i] for i in range(len(a))])
x = ((compare(second, [1,2]) for second in first) for first in dist)
for y in x:
print([next(y),next(y),next(y),next(y),next(y),next(y),next(y)])
如果您添加更多列,则应扩展此范围。 arrays
将为每个条件保存一个数组。 每个这些被处理通过reduce
其又累积bitwise_and
所有阵列。
import numpy as np
from functools import reduce
columns = ['weight', 'height']
thresholds = {'weight': 1.0, 'height': 1.0}
indexes = {'weight': 0, 'height': 1}
l = np.array(dist)
arrays = [(l[:, :, indexes[column]] <= thresholds[column]) for column in columns]
l2 = reduce(lambda a, acc : np.bitwise_and(a, acc), arrays)
print(l2)
输出:
[[ True False True True False False False]
[False True False False False False False]
[ True False True False False False False]
[ True False False True False False False]
[False False False False True False False]
[False False False False False True False]
[False False False False False False True]]
正如@ 1Z10在其评论中所建议的那样, np.reduce
最终将成为您的朋友。
您应该首先构建一个布尔矩阵,其中每个最高级别的行都是子数组与其对应阈值的比较。 然后,无论涉及多少比较,都可以在该矩阵上使用np.reduce
和nb.logical_and
获得结果。
dynamic_expr = np.logical_and.reduce(np.array(
[dist[:, :, indexes[col]] <= thresholds[col]
for col in columns]))
print(dynamic_expr)
输出为:
[[ True False True True False False False]
[False True False False False False False]
[ True False True False False False False]
[ True False False True False False False]
[False False False False True False False]
[False False False False False True False]
[False False False False False False True]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.