Используйте поиск по совокупной сумме values
, чтобы перейти непосредственно к следующей группе. Это даст вам производительность O (n log n), где n - количество групп в значениях:
import numpy as np
def meanBlocks(values,values2,threshold):
sums = np.cumsum(values)
i = j = k = 0
output = np.zeros(values.size)
while j < values.size:
s = sums[j]-values[j]+threshold # s is next cumsum to reach
i,j = j,np.searchsorted(sums,s) # position of next increment by threshold
output[k] = np.mean(values2[i:j]) # track mean of values2 for range
k += 1
return output[:k]
выходы:
values = np.arange(10)
values2 = np.arange(10)*5
print(values)
print(values2)
print(meanBlocks(values,values2,13))
[0 1 2 3 4 5 6 7 8 9] # (0+1+2+3+4) (5+6) (7) ...
[ 0 5 10 15 20 25 30 35 40 45] # (0,5,10,15,20) (25,30) (35) ...
[10. 27.5 35. 40. 45. ] # 50/5 = 10 55/2=27.5 35 ...
print("")
values = np.random.uniform(0,10,300000)
values2 = np.random.uniform(0,10,300000)
print(values)
print(values2)
print(meanBlocks(values,values2,40)) # takes 0.43 sec on my laptop
[6.79333765 2.22880971 1.37706989 ... 8.75649835 2.92422716 5.1280224 ]
[3.56901367 0.15243962 6.76291706 ... 4.47662928 2.61969948 8.0941208 ]
[4.88477774 3.87464821 5.42599828 ... 4.47055786 4.48768768 5.17582407]