不同长度的numpy数组的元素比较

Elementwise comparison of numpy arrays of different lengths

这似乎是一件简单的事情,但我想不通...

first = np.array([0,1,2,0,4,2])
second = np.array([1,2])

我想进行逐元素比较,这样答案就是

array([False, True, True, False, False, True], dtype=bool)

基本上,我希望它对 first 中的每个元素都说 True,这也在 second 中。所以如果 first 有 100 个元素,那么输出也应该有 100 个元素。 但我无法弄清楚如何。我试过使用 np.equalnp.anyfirst==np.any(second) 都无济于事。当然,我可以编写一个循环来执行此操作,但我知道必须有一种方法来执行此相对简单的任务!

听起来您正在尝试做的是笛卡尔乘积运算——将 first 的每个元素与 second 的每个元素进行比较。您可以通过将 second 提升为二维数组来执行此操作,从而获得二维结果:

>>> first == second.reshape(2,1)
array([[False,  True, False, False, False, False],
       [False, False,  True, False, False,  True]])

然后您显然想通过 运行 np.any 将其展平为一行。您可以通过传递 axis 参数来做到这一点:

>>> (first == second.reshape(2,1)).any(axis=0)
array([False,  True,  True, False, False,  True])

这符合您想要的输出,所以我认为这就是您所要求的?

但这当然需要 O(N*M) space(在您的示例中为 6x2)。这通常是 numpy 的方式——如果你想尽可能快地做事,你需要构建一个足够大的数组来保存每一步的所有结果。在这种情况下,因为您是一步完成笛卡尔积,所以这是一个 6x2 数组。

但很多时候,这并不是您真正想要的。如果您只想针对 second 中的每个值对 first 中的每个值进行 in 类型的搜索,只需使用 isin 函数,它会完成相同的工作没有 构建 6x2 阵列。而且它也比您尝试编写的内容更简单。

你要的是np.isin所做的:

>>> import numpy as np
>>> first = np.array([0,1,2,0,4,2])
>>> second = np.array([1,2])
>>> np.isin(first, second)
array([False,  True,  True, False, False,  True])