不同长度的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.equal
、np.any
、first==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])
这似乎是一件简单的事情,但我想不通...
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.equal
、np.any
、first==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])