两个数组中特定值的 Numpy 元素明智比较

数据挖掘 Python 麻木的
2022-02-18 06:01:18

如果我有两个数组,如下所示:

a = numpy.array([0, 0, 1, 0, 1, 1, 1, 0, 1])
b = numpy.array([1, 1, 1, 0, 0, 1, 1, 0, 0])

有没有一种简单的方法使用 numpy 来计算两个数组中每个数组中相同索引处的元素的值等于 1 的出现次数。在上述两个数组中,位置(零索引)2、5 和 6 中的元素在两个数组中都等于 1。因此,我想在这里计数 3。

感谢您提供的任何帮助。

3个回答

我将向您展示两种方式(使用 NumPy 的方式可能更多):

第一种方法:链式操作

您可以使用“屏蔽”,然后进行比较,最后使用求和操作:

我们希望a索引中的所有值b等于 1:

part1 = a[b == 1]

现在我们想要所有part1等于 1 的地方

part2 = part1[part1 == 1]

a现在我们剩下和b等于 1的所有地方,所以我们可以简单地总结它们:

result = part2.sum()

方法二:内置numpy.where

这很短,并且计算速度可能更快。NumPy 有一个很好的函数,它返回在某些数组中满足条件的索引:

condition_1 = (a == 1)
condition_2 = (b == 1)

现在我们可以通过说“和”来组合操作 - 二元运算符版本:&

part1 = numpy.where(condition_1 & condition_2)

为了获得您想要的输出,我们可以获取结果索引集的长度:

result = len(part1)

阅读有关numpy.where的文档,了解它可以为您做的其他事情!

我喜欢@RobinNicole 的回答——就数学而言,您正在寻找两个布尔向量的乘积。

这里有一些 Numpy 方法可以做到这一点:

In [37]: np.dot(a, b)
Out[37]: 3

In [38]: a @ b
Out[38]: 3

这是另一个更通用的解决方案,它也适用于非布尔向量:

In [48]: ((a == 1) & (b == 1)).sum()
Out[48]: 3
sum(a * b) 

应该做的工作:)

正如@n1k31t4 所指出的,它仅在您有两个仅包含 0 和 1 的数组时才有效。否则您将不得不编写如下内容:

 sum((a == 1) * (b ==1)) 

我在这里发现有趣的是 sum 函数将布尔向量视为具有 0 (for False)和 1 (for True)的向量,您可以在其上执行算术运算(+for or*forand等)