这似乎是一件简单的事情,但我无法理解......
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.equal
,np.any
,first==np.any(second)
无效。当然,我可以写一个循环来做这个,但我知道必须有办法做这个相对简单的任务!
答案 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阵列。它也比你想写的更简单。