如何检查一个NumPy数组的每一行是否包含在另一个数组中?

4
我的问题与测试Numpy数组是否包含给定行类似,但我需要对所链接问题中提供的方法进行一个非平凡扩展。该链接的问题是询问如何检查数组中的每一行是否与单独的另一行相同。这个问题的重点是针对多行执行此操作,一个显然不会导致另一个。

假设我有一个数组:

array = np.array([[1, 2, 4], [3, 5, 1], [5, 5, 1], [1, 2, 1]])

我想知道这个数组的每一行是否在给定的次要数组中:
check_array = np.array([[1, 2, 4], [1, 2, 1]])

理想情况下,它应该看起来像这样:

is_in_check = array in check_array

is_in_check函数长这样:

is_in_check = np.array([True, False, False, True])

我知道对于非常小的数组,使用列表推导或类似的方法会更容易,但是这个过程必须具有大约106行的数组的性能表现。

我已经看到检查单个行的正确方法是:

is_in_check_single = any((array[:]==[1, 2, 1]).all(1))

但理想情况下,我希望将此过程推广到多行数据上,以便实现向量化处理。

在实践中,我期望每个数组具有以下维度:

array.shape = (1000000, 3)
check_array.shape = (5, 3)

你能提供实际中预期看到的维度吗?例如 array.shapecheck_array.shape。同时了解数组中可能出现的唯一值的数量也会有所帮助(例如在此示例中 1, 2, 3, 4, 5 -> 5)。 - hilberts_drinking_problem
抱歉,我在描述可能有多长时使用“索引”而不是“行”,可能让事情变得混乱了。我已经修复了这个问题,并在底部给出了预期的形状。该算法是基于距离的对称性查找算法,因此我想在1,000,000行数组中只会有50-100个唯一的行。 - Connor
1个回答

6

广播是一种选项:

import numpy as np

array = np.array([[1, 2, 4], [3, 5, 1], [5, 5, 1], [1, 2, 1]])

check_array = np.array([[1, 2, 4], [1, 2, 1]])

is_in_check = (check_array[:, None] == array).all(axis=2).any(axis=0)

产生:

[ True False False  True]

另一种广播方式:

is_in_check = (check_array == array[:, None]).all(axis=2).any(axis=1)

也能生产

[ True False False  True]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接