有以下距离矩阵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]])]
如果添加更多列,则应该扩展。 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)
我使用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
正如@ 1Z10在评论中所建议的那样,np.reduce
最终会成为你的朋友。
您应该首先构建一个boolean矩阵,其中每个最高级别的行是子阵列与其对应阈值的比较。然后在该矩阵上使用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]]
输出是:
qazxswpoi