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

时间:2018-04-03 22:53:08

标签: python numpy comparison elementwise-operations

这似乎是一件简单的事情,但我无法理解......

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

我想做元素比较,以便答案是

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

基本上我希望它为True中的first中的每个元素说second。因此,如果first有100个元素,那么输出也应该有100个元素。 但我无法弄清楚如何。我尝试使用np.equalnp.anyfirst==np.any(second)无效。当然,我可以写一个循环来做这个,但我知道必须有办法做这个相对简单的任务!

2 个答案:

答案 0 :(得分:2)

您要求的是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])

答案 1 :(得分:0)

听起来你正在尝试做的是笛卡尔积产品操作 - 将first的每个元素与second的每个元素进行比较。您可以通过将second提升为2D数组来实现此目的,这样您就可以获得2D结果:

>>> 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)空间(在您的示例中为6x2)。这通常是numpy的方式 - 如果你想尽可能快地做事,你需要建立一个足够大的数组来保存每一步的所有结果。在这种情况下,因为您只需一步即可完成笛卡尔积,即6x2阵列。

但很多时候,这实际上并不是你想要的。如果您只想针对in中的每个值first进行second类型搜索,只需使用isin函数,它将执行相同的工作没有构建一个6x2阵列。它也比你想写的更简单。