我正在尝试在我的一项作业中进行一些异常检测,并且正在尝试创建滑动窗口,但我想让它们使一个窗口不会与另一个窗口重叠。例如 数组 = [1, 2, 3, 4, 5, 6] 我想要得到这个结果 结果 = [[1, 2, 3], [4, 5, 6]] 显然,您可以使用 as_strided 或 moving_window_view 方法,但第二个方法效果不佳,但如果有人知道解决此问题的方法,我们将不胜感激
你的一维数组:
In [234]: x=np.arange(1,7)
简单的重塑:
In [235]: x.reshape(-1,3)
Out[235]:
array([[1, 2, 3],
[4, 5, 6]])
滑动窗口创建 (3,) 个窗口,完全重叠
In [236]: np.lib.stride_tricks.sliding_window_view(x,3)
Out[236]:
array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
从中我们可以轻松地切出不重叠的元素:
In [237]: np.lib.stride_tricks.sliding_window_view(x,3)[::3]
Out[237]:
array([[1, 2, 3],
[4, 5, 6]])
要使用
as_strided
,我们必须了解strides
。 sliding_windows
为我们做这样的思考:
In [238]: x.strides
Out[238]: (4,)
In [239]: np.lib.stride_tricks.as_strided(x,shape=(2,3),strides=(12,4))
Out[239]:
array([[1, 2, 3],
[4, 5, 6]])
那个
12
是(3*4)
相当于sliding_windows:
In [240]: np.lib.stride_tricks.as_strided(x,shape=(4,3),strides=(4,4))
Out[240]:
array([[1, 2, 3],
[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
sliding_windows
更容易使用,因为我们不需要了解步幅,并且它可以确保结果的大小正确。