检查numpy数组是否是另一个数组的子集
在SO上已经问过类似的问题,但是它们有更具体的约束,其答案不适用于我的问题。
一般来说,确定任意numpy数组是否是另一个数组的子集的最有效方法是什么?更具体地说,我有大约20000x3的数组,我需要知道完全包含在集合中的1x3元素的索引。更普遍地讲,是否有更Python化的方式编写以下代码:
master=[12,155,179,234,670,981,1054,1209,1526,1667,1853] #some indices of interest
triangles=np.random.randint(2000,size=(20000,3)) #some data
for i,x in enumerate(triangles):
if x[0] in master and x[1] in master and x[2] in master:
print i
对于我的用例,我可以安全地假设len(master)<<20000。(因此,可以安全地假设master是有序的,因为这很便宜)。
-
您可以通过迭代列表推导中的数组来轻松实现此目的。一个玩具示例如下:
import numpy as np x = np.arange(30).reshape(10,3) searchKey = [4,5,8] x[[0,3,7],:] = searchKey x
给
array([[ 4, 5, 8], [ 3, 4, 5], [ 6, 7, 8], [ 4, 5, 8], [12, 13, 14], [15, 16, 17], [18, 19, 20], [ 4, 5, 8], [24, 25, 26], [27, 28, 29]])
现在遍历元素:
ismember = [row==searchKey for row in x.tolist()]
结果是
[True, False, False, True, False, False, False, True, False, False]
您可以按照问题中的内容将其修改为子集:
searchKey = [2,4,10,5,8,9] # Add more elements for testing setSearchKey = set(searchKey) ismember = [setSearchKey.issuperset(row) for row in x.tolist()]
如果需要索引,请使用
np.where(ismember)[0]
它给
array([0, 3, 7])