Как установить n последовательных элементов с ненулевой кумулятивной суммой в один, а остальные в ноль в numpy? - PullRequest
1 голос
/ 25 февраля 2020

У меня есть массив 1D numpy, состоящий из 1 и 0. Мне нужно изменить его на массив в соответствии с этими условиями.

  1. Если число 0 между двумя 1 меньше 3, все эти 0 должны быть равны 1.
  2. В полученном массиве, если число последовательных 1 меньше 4, все эти 1 должны быть установлены в 0.

, т.е. если мой массив равен

[0,1,1,1,0,0,0,1,1,0,0,1,1,0,0,0,0,1,0]

его следует изменить на

[0,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0]

, а затем на

[0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0]

Я пытался использовать скользящее среднее но безрезультатно. Как мне написать общую функцию, желательно с n вместо 3 и m вместо 4?

1 Ответ

1 голос
/ 25 февраля 2020

Если вы используете ядро ​​Python?

l = [0,1,1,1,0,0,0,1,1,0,0,1,1,0,0,0,0,1,0]

def split(l):
    res = []
    subres = [l[0]]
    for i in range(len(l) - 1):
        if l[i] == l[i + 1]:
            subres.append(l[i + 1])
        else:
            res.append(subres)
            subres = [l[i + 1]] 
    res.append(subres)       
    return(res)

def setall(l, val):
    for i in range(len(l)):
        l[i] = val
    return(l)    

def recode(l, changeval, replaceval, lenlimit):
    for i in range(len(l) - 1):
        el = l[i + 1]     
        if (el[0] == changeval) & (len(el) < lenlimit) & (i < (len(l) - 2)):
            el = setall(el, replaceval)
        l[i + 1] = el
    return(l)    

def flatten(l):
    res = []
    for el in l:
        res.extend(el)
    return(res)

# starting list
print(l)

# step 1
want1 = split(l)
want1 = flatten(recode(want1, 0, 1, 3))
print(want1)

# step 2
want2 = split(want1)
want2 = flatten(recode(want2, 1, 0, 4))
print(want2)

#[0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0]
#[0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0]
#[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...