检查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])

以上是 检查numpy数组是否是另一个数组的子集 的全部内容, 来源链接: utcz.com/qa/397444.html

回到顶部