Python 获取长度为N的所有可能块

Python 获取长度为N的所有可能块,python,numpy,Python,Numpy,我有一个数组,其形状(100000,),我想在其上应用一个长度为200、步长为1的滑动窗口。这意味着输出数组将具有形状(99800200)——即所有长度为200的唯一块。我在numpy中找不到一个有效的函数来实现这一点。我试过: 范围内i的(数据.shape[0]-200): windows=np.append(windows,数据[i:i+200]); 这不仅会产生错误的形状(1D),而且速度非常慢。Numpy中是否有快速功能可以执行此操作?请尝试Numpy中的stride\u技巧。它基本上

我有一个数组,其形状
(100000,)
,我想在其上应用一个长度为200、步长为1的滑动窗口。这意味着输出数组将具有形状
(99800200)
——即所有长度为200的唯一块。我在numpy中找不到一个有效的函数来实现这一点。我试过:

范围内i的
(数据.shape[0]-200):
windows=np.append(windows,数据[i:i+200]);

这不仅会产生错误的形状(1D),而且速度非常慢。Numpy中是否有快速功能可以执行此操作?

请尝试
Numpy
中的
stride\u技巧。它基本上不会比原始数组
a
占用任何额外的空间,而是创建一个包含所有滑动窗口的(虚拟)跨步数组

def幻灯片(a,尺寸):
步幅a.步幅[0]
n=a.尺寸-尺寸+1
返回np.lib.stride\u tricks.as\u stride(a,shape=(n,size),strips=(stride,stride))
a=np.arange(100000)
幻灯片(a,尺寸=200)
>>>数组([[0,1,2,…,197198199],
[    1,     2,     3, ...,   198,   199,   200],
[    2,     3,     4, ...,   199,   200,   201],
...,
[99798, 99799, 99800, ..., 99995, 99996, 99997],
[99799, 99800, 99801, ..., 99996, 99997, 99998],
[99800, 99801, 99802, ..., 99997, 99998, 99999]])
这里有一个简单的答案

窗口大小=10
i=np.arange(data.size-窗口大小+1)
索引=np.add(np.arange(window\u size)]*(data.size-window\u size+1)),即重塑(-1,1))
windows=数据[索引]

我见过的最好的函数(非
numpy
)是
skimage.util.view\u as\u windows()


如果您只想要
numpy
,dupe target中的配方是最一般的答案,尽管@swag2198在这里的另一个答案中建议使用更轻量级的版本。

这是否回答了您的问题?如果您不只是
numpy
,那么
skimage.util.view\u as\u windows()
用户友好。重要的是,基于
view
的窗口函数不会比原始数组占用更多的磁盘空间,而任何复制数据的方法(如您的代码和@AlexP的回答中所示)很容易导致
内存错误
s。取舍是,您不应该以任何矢量化的方式读回窗口,因为这可能导致竞争条件。
from skimage.util import view_as_windows

windows = view_as_windows(data, 200)