np.isin(elements, test_elements)
是布尔值的2D数组(n行2列),表示test_elements
中是否有一个纯量.
向每一行添加all
(顺便说一句,您应该使用numpy:np.isin(elements, test_elements).all(axis=1)
来判断两个元素是否都是True,但并不能按照您的要求进行.它不会因为同一行而判断它们是否都为真.
np.isin([(913, 833)], test_elements)
就是[[True, True]]
,因为913和833都在test_elements
中.所以np.isin([(913, 833)], test_elements).all(axis=1)
是真的,但这并不能证明你想要什么.
你无法用isin
个来实现你想要的.首先,elements
的行不是tuple,可以像Python中那样进行索引和比较.它们是一堆数据(numpy与Python的二元组不同).其次,无论如何,isin
文档表明test_elements
即使不是1D也是扁平的.因此isin
仅判断单个纯量值.
如果你想用纯numpy来做到这一点(但不确定这是一个好主意),你基本上需要进行交互(但以numpy的方式).
(np.array(elements)[:,None,:] == np.array(test_elements)[None,:,:])
是一个3D数组,其元素[x,y,z]
表示elements
行x的列z是否等于test_elements
行y的列z
所以
(np.array(elements)[:,None,:] == np.array(test_elements)[None,:,:]).all(axis=2)
是一个2D数组,其元素[x,y]
表示elements
行x的两列是否等于test_elements
行y的两列.
所以
(np.array(elements)[:,None,:] == np.array(test_elements)[None,:,:]).all(axis=2).any(axis=1)
是一个1D数组,其元素[x]
表示elemnts
行x的两列是否与test_elements
行的任何行的两列相等.
这就是你想要的.
再说一次,不确定这是一个好主意.尤其是从Python二元组开始.
如果列表很小,那么无意中听说将所有这些翻译成numpy数组的风险比在集中进行纯Python搜索更大,例如:
S=set(test_elements)
[row in S for row in elements]
(它利用了二元组在集合 struct 中是可排序、可哈希、可比较等的事实)
如果列表更大,那么,当然,numpy的负担变得可以忽略,并且O(n.m.c)算法(其中n和m是两个列表的行数,c是列数)将尽快实现.
但是,它仍然是一个O(n.m.c)算法,而set
版本可能是一个O(n.log(m))算法.当然,即使我对set
场表演很天真,一些临时方法也可以击败它.(就像四叉树一样,因为这就像在平面中寻找匹配点一样)
无论哪种方式,这并不是一个真正适合numpy one-liners的工作(您可以用numpy tho实现四叉树库,但那是另一回事了).
TL;博士
isin
做不到
- 不要试图用麻木的俏皮话来做到这一点.
- 但如果你无论如何坚持这样做,那么
(np.array(elements)[:,None,:] == np.array(test_elements)[None,:,:]).all(axis=2).any(axis=1)
是一行台词
- 如果
elements
不是太大,就用pony的集合
S=set(test_elements)
[row in S for row in elements]
- 如果这些都是巨大的列表,那么请找到一个临时代码来搜索2D元素.就像四叉树一样.或者是一个具有指数化的 pyramid .