检查numpy数组是否是另一个数组的子集
在SO上已经问过类似的问题,但是它们有更具体的约束,其答案不适用于我的问题。
一般来说,确定任意numpy数组是否是另一个数组的子集的最有效方法是什么?更具体地说,我有大约20000x3的数组,我需要知道完全包含在集合中的1x3元素的索引。更普遍地讲,是否有更Python化的方式编写以下代码:
master=[12,155,179,234,670,981,1054,1209,1526,1667,1853] #some indices of interesttriangles=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 npx = 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 testingsetSearchKey = 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