比较布尔数组:计算两者都为真的次数

Comparing Boolean Arrays: Count number of times BOTH are True

我想知道如何计算多个 NumPy bool 数组中真正元素的数量。例如,在哪些试验中 A 和 B == 1。下面是我尝试过的。

A = array([1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1, 2, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 2, 1, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 2, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2, 2, 2, 1])
B = np.array([ 1.,  1.,  1.,  1.,  1.,  1.,  0.,  1.,  0.,  1.,  1.,  1.,  1., 0.,  1.,  0.,  0.,  1.,  1.,  1.,  0.,  0.,  1.,  0.,  1.,  1., 1.,  1.,  1.,  1.,  0.,  1.,  1.,  0.,  1.,  1.,  1.,  0.,  0., 0.,  1.,  1.,  0.,  0.,  1.,  0.,  1.,  1.,  1.,  1.,  1.,  1., 1.,  1.,  1.,  0.,  1.,  0.,  1.,  0.,  1.,  1.,  1.,  1.,  0., 0.,  1.,  0.,  0.,  1.,  1.,  1.,  0.,  0.,  1.,  0.,  1.,  1., 0.,  1.,  1.,  1.,  0.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,  0., 1.,  0.,  1.,  0.,  1.,  1.,  1.,  0.,  0.,  1.,  1.,  1.,  0., 0.,  1.,  1.,  0.,  1.,  1.,  1.,  0.,  1.,  0.,  1.,  1.,  0., 1.,  0.,  0.,  0.,  0.,  1.,  1.,  1.,  0.,  0.,  0.,  1.,  0., 1.,  1.,  1.,  1.,  1.,  0.,  0.,  1.,  0.,  1.,  0.,  1.,  1., 1.,  1.,  1.,  1.,  1.,  1.,  0.,  0.,  1.,  1.,  1.,  1.,  0., 1.,  1.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  1.,  1.,  0.,  0., 0.,  0.,  1.,  1.,  1.,  0.,  1.,  1.,  0.,  1.,  1.,  1.,  1., 0.,  0.,  1.,  0.,  1.,  1.,  1.,  0.])

num_trials = len(A)
slide_avg = np.zeros(num_trials)

for i in range(num_trials):
    if i < num_trials_slide:
        slide_avg[i] = np.sum(A[0:i+1] == 1 and B[0:i+1] == 1)/float(np.sum(A[0:i+1] == 1))

我收到以下错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

如果您简单地将数组按元素相乘成一个新数组(例如 C),则等于 1 的元素数将等于同时满足两个条件的元素数A 和 B 为真。

len(np.where(A*B == 1)[0])

@AustinA 非常聪明 利用了 1*1=1.

一个可能的不足是在您有非整数值的情况下,即 2.0 和 0.5,根据此逻辑计算结果为 1.0。如果是这样,另一种选择是:

np.sum((A == 1) & (B == 1))
# 24

但是如果你使用的是所有整数,@Austin 的答案应该快 2 倍左右。