Re: [问题] python numpy 向量化

楼主: mychiux413 (小邱)   2020-05-10 21:26:51
如果你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
作者: pinner (莲踢踢)   2020-05-13 21:56:00
跟我要的东西一样!解谢大大

Links booklink

Contact Us: admin [ a t ] ucptt.com