如何创建一个与 numpy 数组重叠 50% 的滑动窗口? [复制]
Posted
技术标签:
【中文标题】如何创建一个与 numpy 数组重叠 50% 的滑动窗口? [复制]【英文标题】:How do I create a sliding window with a 50% overlap with a numpy array? [duplicate] 【发布时间】:2018-01-25 14:19:38 【问题描述】:假设我有一个这样的数组:
array([1, 2, 3, 4, 5, 5, 7, 8, 9, 10])
我想改成
array([1, 2, 3, 4]), array([3, 4, 5, 6]), array([5, 6, 7, 8]), array([7, 8, 9, 10])
这里的窗口大小为4
,步长为2
。
如何在 Python 函数中执行此操作?
【问题讨论】:
看起来像基本的 numpy 用法。你尝试了什么?您显然需要创建新数组,所以您是否尝试了一个列表理解,其中 start-index 是由 python 的 range() 和 step 控制的? 您想要四个独立的阵列而不是单个 4x4 阵列吗?后者可能更方便,只是as_strided
的一个应用。
我想要后者
对于这个用例的一些更一般的 as_strided 示例:skimage's view_as_windows。
【参考方案1】:
你想要numpy.lib.stride_tricks.as_strided
def window(a, w = 4, o = 2, copy = False):
sh = (a.size - w + 1, w)
st = a.strides * 2
view = np.lib.stride_tricks.as_strided(a, strides = st, shape = sh)[0::o]
if copy:
return view.copy()
else:
return view
Out[]:
array([[ 1, 2, 3, 4],
[ 3, 4, 5, 6],
[ 5, 6, 7, 8],
[ 7, 8, 9, 10]])
如果要写入窗口数组,请务必设置copy = True
,否则它是内存共享视图。
【讨论】:
我应该在哪里添加copy()
?
为澄清而编辑的答案,还修复了偏移量,因为这仅适用于您之前的玩具问题
Expected type 'Optional[Iterable[int]]
,得到'int'而不是strides=st
你的意见是什么a
?
我输入了a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
以上是关于如何创建一个与 numpy 数组重叠 50% 的滑动窗口? [复制]的主要内容,如果未能解决你的问题,请参考以下文章