如果你np.cumsum(A)沒有溢位問題, 可以試試這個,
我試了一下, 用np.vectorize似乎可行, 代碼如下,
看看是不是你要的意思, 其中邊界問題你再自己修一下
因為我不清楚你的B[i]~B[i+1]包不包含邊界值
核心概念就是我只對A做一次np.cumsum令為C
*** 每一區段減掉上一次區段最後的值就是當區段的cumsum ***
import numpy as np
A = np.array([1,-2,3,-4,5,-6,7,-8]*int(1e2)) # 超長Array A
B = np.array([2, 4, 6, 7, 10, 13])
B_starts = B[:-1]
B_ends = B[1:]
C = np.cumsum(A[:(B[-1]+1)]) # cumsum只要做一次就好, 但做到max(B)就夠了
C = np.append(0, C) # 放一個假的"上區段最後值=0"
print('Lengths: A[{}], B[{}], B_starts[{}], B_ends[{}], C[{}]'.format(
len(A), len(B), len(B_starts), len(B_ends), len(C)))
def judge(start, end):
"""每一段的評估"""
return np.any(C[start:end] - C[start-1] < 0)
vec_func = np.vectorize(judge, cache=True)
output = vec_func(start=B_starts+1, end=B_ends+1)
%timeit vec_func(start=B_starts+1, end=B_ends+1)
assert len(output) == len(B) - 1
assert output[0] == True
assert output[1] == True
assert output[2] == False