在NumPy方法中转换循环

gcmastyq  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(117)

我需要获得数组longband的累积最大值,直到它的[i-1]值是RsiMa[i]>=,然后转到它的“实际”[i]值并重新开始累加。实际上,我发现实现这一点的唯一方法是通过for循环。
它可以翻译成麻木吗?
我怎样才能转换它呢?
代码:

import numpy as np
RsiMa = np.array([   2, 4, 6, 9, 10, 8, 6, 4, 6, 8, 10, 12, 10, 8])
longband = np.array([1, 3, 2, 8, 7,  5, 4, 3, 4, 3,  7, 10,  7, 6])

for i in range(1, len(longband)):
    if i > 1:
        if longband[i-1] > longband[i] and longband[i-1] < RsiMa[i]:
            longband[i] = longband[i-1]

预期产出:

[ 1  3  3  8  8   5  5  3  4  4  7  10  7  7 ]

我已经尝试使用np.fmax.accumate(),但在longband[i] >= RsiMa[i]时似乎无法重新启动...

编辑:

我还尝试了Numba jit:

@numba.jit(nopython=True)
def loop(array1, arrayfilt):
    for i in range(2, len(array1)):
        if array1[i-1] > array1[i] and array1[i-1] <= arrayfilt[i]:
            array1[i] = array1[i-1]
    return array1
longband = loop(longband, RsiMa)

但是IDK为什么它没有加速它,反而导致从简单循环的15ms减慢到33ms的jit……

q8l4jmvw

q8l4jmvw1#

这种方法不会带来任何改进,但至少是有效的:


### vector function  ###

def vect(array1, array2, counter):
    if (array1[counter-1] > array1[counter] and array1[counter-1] < array2):
        array1[counter] = array1[counter-1]
    return array1[counter]

vvect = np.vectorize(vect, excluded=['array1'])
longband = vvect(array1=longband, array2=RsiMa, counter=np.arange(0, len(longband)))
OUTPUT: [ 1  3  3  8  8   5  5  3  4  4  7  10  7  7 ]

相关问题