Python 修改numpy数组以获得元素之间的最小值数

Python 修改numpy数组以获得元素之间的最小值数,python,numpy,Python,Numpy,我有一个numpy数组的形式:arr=0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 我想修改它,使任何两个1之间至少有七个0。如果少于七个0,则将间隔1转换为0。 我在想numpy.where可以在这里工作,但不确定如何以简洁、通俗的方式工作: 输出应如下所示: 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 numpy.where(arr[:] > 1.0, 1.0, 0.0) 下面的代码是

我有一个numpy数组的形式:
arr=0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1

我想修改它,使任何两个1之间至少有七个0。如果少于七个0,则将间隔1转换为0。 我在想numpy.where可以在这里工作,但不确定如何以简洁、通俗的方式工作:

输出应如下所示:

0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

numpy.where(arr[:] > 1.0, 1.0, 0.0)

下面的代码是一个非常难看的hack,但是它在线性时间内完成了任务(假设7是固定的),而不需要使用Python循环,也不需要像Numba或Cython这样的任何东西。我不建议使用它,尤其是如果下个月7可能是700

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

arr2 = numpy.append(1-arr, [0]*7)
numpy.power.at(rolling_window(arr2[1:], 7), np.arange(len(arr)), arr2[:-7, None])
arr = 1 - arr2[:-7]

它的工作原理是将1s设置为0s,反之亦然,然后对每个元素
x
,将接下来7个点中的每个元素
y
设置为
y**x
,然后撤消0/1开关。幂运算将所有内容设置在0到1之间的7个空间内,这样,在阵列的更深处,幂运算可以立即看到效果。

现在这只是一个用于循环和ifs的简单实现,但我非常确定它可以压缩。(很多!)是的,没有必要为此执行Numpy,这只会使你的事情复杂化

question = [0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1]
result = [0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]
indexesOf1s = []
for index,item in enumerate(question):     #Here just calculate all the index of 1s
if item == 1:
    indexesOf1s.append(index)
for i in indexesOf1s:               #Iterate over the indexes and change acc to conditions
    sub = i - indexes[indexes.index(i)-1]
    if sub>0 and sub>=7:
        question[i] = 1
    elif sub>0:
        question[i] = 0
print question 
print result

np.其中
不起作用。考虑到问题本质上是有状态的-任何1是否被擦除在很大程度上取决于以前的擦除决定-我怀疑是否有一个好的方法通过NumPy操作来完成。谢谢@user2357112,那么我应该返回for循环吗?这是一个选项。你也可以尝试一些方法来清除多余的元素,或者尝试一些真正的黑客行为,使用合适的ufunc的
at
方法和一个滚动窗口。同一问题可能存在多种解决方案。也就是说,除非你采用“两个人在战斗,两个人在错误的地方”的方法,在这种情况下,通过输入的卷积掩蔽就可以了。谢谢@user2357112,为什么你不推荐你的soln为700而不是7?速度问题?@user308827:速度问题。这需要
O(window*len(arr))
时间,其中
arr
是您正在处理的数组,
window
是连续1之间需要的0数。而且,不管速度如何,这段代码都很难理解,容易出现bug,而且非常奇怪。