Home > Back-end >  Translate loop in numpy methods
Translate loop in numpy methods

Time:10-20

I need to get the cumulative maximum of array longband until its [i-1] value is >= of RsiMa[i], then turn to its "real" [i] value and restart cumulating. Actually the only way I found to achieve this is by a for loop.
Is it translatable to numpy?
How can I convert it?

THE CODE:

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]

EXPECTED OUTPUT:

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

I already tried with np.fmax.accumulate() but seems like it can't be restarted when longband[i] >= RsiMa[i]...

EDIT:
I tried also with 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)

but IDK why, instead of accelerating it, it cause a slowdown from 15ms of the simple loop to 33ms of jit...

CodePudding user response:

This method do not prodice any improvement, but at least works:

###  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 ]
  • Related