当前位置: 首页 > 面试题库 >

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

柳奇希
2023-03-14
问题内容

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


 类似资料:
  • 这是一个流行的问题,但我找不到一个满足我案例的答案。 我有布尔数组,其中我试着看一个数组是不是另一个数组的子集。 示例: 在本例中,不是两者的子集,但是的子集。 我尝试了一些从布尔的真值创建整数数组的麻烦尝试,但我仍然不确定如何验证它们是按顺序排列的(即一个子集)。 这个也没用。 目标是确定一个数组是否包含另一个数组的所有元素。在这种情况下,将索引4和5作为true,这在中也是true 但是如果我

  • 问题内容: 如何有效地检查整数数组中的所有元素是否是Java中另一个数组的所有元素的子集?例如,[33 11 23]是[11 23 33 42]的子集。提前致谢。 问题答案: 从超集数组中取出一个。检查子集中数组的每个元素是否包含在中。这是非常快速的操作。

  • 问题内容: 我想为数组中的每个值返回一个布尔值,指示它是否在array中。我猜这应该是一个标准程序,但是我找不到有关如何执行此操作的任何信息。我的尝试如下: 但是,我得到了错误: 我使用的是numpy,因此首选使用numpy或标准Python的解决方案。 问题答案: 我相信您可以使用-

  • 问题内容: 我想找出$ all是否包含所有$ search_this值并返回true或false。有什么想法吗? 问题答案: 看一下array_intersect()。

  • 问题内容: 我有两个数组,我想检查是否每个元素都在中。如果元素的值在中重复,则该元素的值必须相等。最好的方法是什么? 问题答案: 一种选择是对两个数组进行排序,然后遍历两个数组,然后比较元素。如果在超级袋中未找到子袋候选中的元素,则前者不是子袋。排序通常为O(n *log(n)),比较为O(max(s,t)),其中 s 和_t_是数组大小,总时间复杂度为O(m * log(m)) ,其中m =ma

  • 问题内容: 我在PHP中有两个数组,如下所示: 人: 通缉犯: 如何检查是否 所有 的的 人们 元素是在 通缉犯 阵列? 在此示例中,它应该返回,因为在 通缉犯中 。 问题答案: 您可以使用。