Вы можете использовать логический_и или просто оператор *
в массиве numpy, который дает умножение по элементам
import numpy as np
def count_match (v, A, B, C):
cond = np.logical_and(A == 1, B >= v)
cond = np.logical_and(cond, C == 1)
# alternatively, use an element wise product:
cond = (A == 1) * (B >= v) * (C == 1)
# counting the number of 1
count = np.sum(cond)
return count
A_a = np.array([1, 0, 1, 0, 1])
B_a = np.array([0.3, 0.5, 0.6, 0.7, 0.9])
C_a = np.array([1, 0, 1, 1, 1])
A_b = np.array([1, 0, 1, 1, 0])
B_b = np.array([0.3, 0.5, 0.6, 0.7, 0.9])
C_b = np.array([1, 0, 1, 1, 1])
for v in [0.3, 0.5, 0.6, 0.7, 0.9]:
print(v, count_match(v, A_a, B_a, C_a) / count_match(v, A_b, B_b, C_b)) # divides by zero brr
обратите внимание, что для popA и popB условие на массивы A и C не меняются, поэтому вы можете их предварительно вычислить (я сомневаюсь, что это сильно меняет время)
def count_match2(v, pre_cond, B):
return np.sum(pre_cond * (B >= v))
for v in [0.3, 0.5, 0.6, 0.7, 0.9]:
print(v, count_match2(v, (A_a == 1) * (C_a == 1), B_a) / count_match2(v, (A_b == 1) * (C_b == 1), B_b)) # divides by zero brr