Python 如何在numpy中将n个连续元素的非零累积和设置为1,其余元素设置为零?
我有一个由1和0组成的一维numpy数组。我需要根据这些条件将其更改为数组Python 如何在numpy中将n个连续元素的非零累积和设置为1,其余元素设置为零?,python,arrays,python-3.x,numpy,Python,Arrays,Python 3.x,Numpy,我有一个由1和0组成的一维numpy数组。我需要根据这些条件将其更改为数组 如果两个1之间的0数小于3,则所有这些0都应设置为1 在生成的数组中,如果连续1的数量小于4,则所有这些1都应设置为0 i、 如果我的数组是 [0,1,1,0,0,0,1,1,0,0,1,1,0,0,0,0,0,1,0] 应该改成 [0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,0] 然后去 [0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0] 我试过使用移动平均线,但没有用。如果使用
[0,1,1,0,0,0,1,1,0,0,1,1,0,0,0,0,0,1,0]
应该改成
[0,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,0]
然后去
[0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0]
我试过使用移动平均线,但没有用。如果使用核心Python,如何编写通用函数,最好使用
n
而不是3,使用m
而不是4?
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]
l=[0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0]
def拆分(l):
res=[]
subres=[l[0]]
对于范围内的i(透镜(l)-1):
如果l[i]==l[i+1]:
子对象追加(l[i+1])
其他:
res.append(subres)
subres=[l[i+1]]
res.append(subres)
返回(res)
def setall(l,val):
对于范围内的i(len(l)):
l[i]=val
返回(l)
def重新编码(l、changeval、replaceval、lenlimit):
对于范围内的i(透镜(l)-1):
el=l[i+1]
如果(el[0]==changeval)和(len(el)