如何检查 Numpy 数组的每一行是否包含在辅助数组中?

Con*_*nor 2 python arrays numpy vectorization

我的问题类似于测试 Numpy 数组是否包含给定的行,但我需要对链接问题中提供的方法进行非平凡的扩展;链接的问题是询问如何检查数组中的每一行是否与另一行相同。这个问题的重点是对许多行这样做,其中一个显然不会跟随另一个。

说我有一个数组:

array = np.array([[1, 2, 4], [3, 5, 1], [5, 5, 1], [1, 2, 1]])
Run Code Online (Sandbox Code Playgroud)

我想知道这个数组的每一行是否在由以下给出的辅助数组中:

check_array = np.array([[1, 2, 4], [1, 2, 1]])
Run Code Online (Sandbox Code Playgroud)

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

is_in_check = array in check_array
Run Code Online (Sandbox Code Playgroud)

其中 is_in_check 看起来像这样:

is_in_check = np.array([True, False, False, True])
Run Code Online (Sandbox Code Playgroud)

我意识到对于非常小的数组,使用列表理解或类似的东西会更容易,但是该过程必须对 10 6行的数组具有高性能。

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

is_in_check_single = any((array[:]==[1, 2, 1]).all(1))
Run Code Online (Sandbox Code Playgroud)

但理想情况下,我想将其概括为多行,以便对过程进行矢量化。

在实践中,我希望看到每个数组的以下维度:

array.shape = (1000000, 3)
check_array.shape = (5, 3)
Run Code Online (Sandbox Code Playgroud)

Hen*_*ker 5

广播是一种选择:

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]])
Run Code Online (Sandbox Code Playgroud)
is_in_check = (check_array[:, None] == array).all(axis=2).any(axis=0)
Run Code Online (Sandbox Code Playgroud)

产生:

[ True False False  True]
Run Code Online (Sandbox Code Playgroud)

以另一种方式广播:

is_in_check = (check_array == array[:, None]).all(axis=2).any(axis=1)
Run Code Online (Sandbox Code Playgroud)

还生产

[ True False False  True]
Run Code Online (Sandbox Code Playgroud)