我有两个元组列表,我想找到第一个元组中的哪些元素在第二个元组中。例如:
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
)吗?
Numpy 不保留元组,而是将它们转换为数组并按元素工作,这会导致意外的结果。
熊猫系列对待事物如预期:
>>> import pandas as pd
>>> pd.Series(elements).isin(test_elements).tolist()
[True, True, False, True, True, False, True, True, False, False]
来自文档:
类似数组:test_elements
用于测试每个值的值。如果该参数是数组或类似 array,则该参数将被展平。请参阅有关非类似数组参数的行为的注释。element
所以你的元组将被展平,它只会检查
913
和 833
是否都在 np.array(test_elements).flatten()
中,它们确实如此。