2017-10-12 57 views
0

我想知道如何计算多个NumPy布尔数组中真元素的数量。例如,在哪些试验中A和B都是1.下面是我尝试过的。比较布尔数组:计数次数BOTH为真

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() 
+1

用'&'替换'和' – Bakuriu

+1

认为它应该是:'np.sum((A [0:i + 1] == 1)&(B [0:i + 1] == 1)) /float(np.sum(A[0:i+1] == 1))'。 – Divakar

+0

然后我得到以下错误:TypeError:ufunc'bitwise_and'不支持输入类型,并且输入不能安全地强制转换为任何受支持的类型,根据转换规则''''安全'' – Ellen

回答

2

如果只是逐元素相乘的数组到一个新的数组(例如C),元件的数量相等将等于到A和B都为真的元素数量。

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

@AustinA有一个很智能的answer利用了1 * 1 = 1这个事实。

一个可能的不足之处在于您有非整数值的情况,即2.0和0.5,在此逻辑下它将评估为1.0。如果是这样的话,一个替代方案是:

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

但是,如果你使用所有整数,@奥斯汀的答案应该快两倍。