检查numpy数组是否是另一个数组的子集

发布于 2021-01-29 15:00:56

在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是有序的,因为这很便宜)。

关注者
0
被浏览
71
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以通过迭代列表推导中的数组来轻松实现此目的。一个玩具示例如下:

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看