1

这似乎是一件简单的事情,但我无法弄清楚......

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)无济于事。当然,我可以编写一个循环来执行此操作,但我知道必须有一种方法来执行此相对简单的任务!

4

2 回答 2

5

你要的是什么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])
于 2018-04-03T23:06:52.243 回答
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 中的每个值对 in 中的每个值进行in-type 搜索,只需使用该函数,该函数将执行相同的工作,而无需构建 6x2 数组。它也比您尝试编写的更简单。firstsecondisin

于 2018-04-03T23:05:54.897 回答