比较两个元组列表,np.isin

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

我有两个元组列表,我想找到第一个元组中的哪些元素在第二个元组中。例如:

elements = [
     (903, 468),
     (913, 468),
     (926, 468),
     (833, 470),
     (903, 470),
     (917, 470),
     (833, 833),
     (903, 833),
     (913, 833),
     (917, 833),
]
    
test_elements = [
    (903, 468), 
    (913, 468), 
    (833, 470), 
    (903, 470), 
    (833, 833), 
    (903, 833),
]

并且我想返回

elements
中存在于
test_elements
中的元素的布尔掩码。我不明白为什么 np.isin 没有给出正确的结果:

list(map(np.all, np.isin(elements, test_elements)))
>>> [True, True, False, True, True, False, True, True, True, False]

这意味着

(913, 833)
应该在
test_elements
但事实并非如此

这个表达式(我从另一篇文章找到)返回正确的掩码:

list((np.array(elements)[:,None] == np.array(test_elements)).all(2).any(1))
>>> [True, True, False, True, True, False, True, True, False, False]

我错过了

np.isin
(或者可能是
np.all
map
)吗?

python numpy
2个回答
1
投票

Numpy 不保留元组,而是将它们转换为数组并按元素工作,这会导致意外的结果。

熊猫系列对待事物如预期:

>>> import pandas as pd
>>> pd.Series(elements).isin(test_elements).tolist()
[True, True, False, True, True, False, True, True, False, False]

1
投票

来自文档

test_elements
类似数组
用于测试
element
每个值的值。如果该参数是数组或类似 array,则该参数将被展平。请参阅有关非类似数组参数的行为的注释。

所以你的元组将被展平,它只会检查

913
833
是否都在
np.array(test_elements).flatten()
中,它们确实如此。

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