Python Generator表达式:如何从循环中添加AND条件?

问题描述 投票:2回答:3

有以下距离矩阵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]]]

我需要用这样的generator expression条件建立一个AND

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]])]
python generator generator-expression
3个回答
0
投票

如果添加更多列,则应该扩展。 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]]

输出:

x = ([second[0] <= 1 and second[1] <=2 for second in first] for first in dist)
for y in x:
    print(y)

0
投票

我使用list comprehension来应用构建生成器的条件,以相反的方式做错了。无论如何不确定这是不是你想要的。

[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)])

哪个输出相同

现在编写一个单独的函数来进行比较

np.reduce

0
投票

正如@ 1Z10在评论中所建议的那样,np.reduce最终会成为你的朋友。

您应该首先构建一个boolean矩阵,其中每个最高级别的行是子阵列与其对应阈值的比较。然后在该矩阵上使用nb.logical_anddynamic_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]]

输出是:

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.