例如,我有一个数组X [1,3,2,5,1,3],我需要一个像移动窗口一样的新数组,找到每3个项目中最小的数组==> [1,1,1,2,1,1]
我知道我可以从数组len()循环并使用list slip,但这个问题是否存在pythonic方式?
我尝试了X [1],发现类型(X [1])是一个int,无法追溯到数组X.
感谢您的帮助。
编辑:抱歉给您带来不便。我上面犯了一个错误。 对于窗口1,只有第一个元素1,所以输出1 窗口2:[1,3] - > 1 窗口3:[1,3,2] - > 1 窗口4:[3,2,5] - > 2顺便说一句,这对你来说非常有帮助。谢谢。
答案 0 :(得分:1)
map(min, zip(a[1:]+[max(a)], [max(a)]+a, a+[max(a)]))
我不知道它是否是一种pythonic方式。它只是一个棘手的单线程,并不比普通的循环更好。
答案 1 :(得分:1)
In [33]: X = [1, 3, 2, 5, 1, 3]
In [34]: list(map(min, (X[i:i+3] for i in range(len(X)-2))))
Out[34]: [1, 2, 1, 1]
答案 2 :(得分:0)
def pairwise( iterable, n=2 ):
from itertools import tee, izip, islice
return izip(*(islice(it,pos,None) for pos,it in enumerate(tee(iterable, n))))
x = [1, 3, 2, 5, 1, 3]
list(pairwise(x,3))
#[(1, 3, 2), (3, 2, 5), (2, 5, 1), (5, 1, 3)]
map(min, pairwise(x,3))
#[1, 2, 1, 1]
答案 3 :(得分:0)
history = collections.deque((None, None), 2) # sentinel
for x in your_input:
result = min(x, min(history))
history.append(x)
哨兵的选择取决于你想如何对待输入的开始。
或者如果这更清楚
window = collections.deque((), 3)
for x in your_input:
window.append(x)
result = min(window)
首先使用显式历史作为OP主题,最后一个显式窗口。
带有size参数的 deque
会在超出大小时自动从追加的另一端删除元素。