“重复”Partition array into N chunks with Numpy 建议 np.split - 这对于不重叠的拆分很好。该示例(在关闭之后添加?)重叠,每个子数组中有一个元素。加上它用 0 填充。
How do you split a list into evenly sized chunks? 有一些很好的列表答案,有各种形式的生成器或列表理解,但乍一看,我没有看到任何允许重叠的东西——尽管巧妙地使用了迭代器(例如 iterator.tee)这应该是可能的。
我们可以将此归咎于问题措辞不佳,但它不是重复的。
从示例和评论开始:
这里我的窗口大小是 3.,即每个拆分列表应该有 3 个元素首先拆分 [1,2,3] 并且步长是 2 ,所以第二个拆分开始应该从第 3 个元素开始,第二个拆分是 [3,4, 5]分别。
这是使用as_strided的高级解决方案
In [64]: ast=np.lib.index_tricks.as_strided # shorthand
In [65]: A=np.arange(1,12)
In [66]: ast(A,shape=[5,3],strides=(8,4))
Out[66]:
array([[ 1, 2, 3],
[ 3, 4, 5],
[ 5, 6, 7],
[ 7, 8, 9],
[ 9, 10, 11]])
我增加了A的范围,因为我不想处理0 pad。
选择目标shape 很简单,5 组,每组 3 组。选择跨步需要更多关于跨步的知识。
In [69]: x.strides
Out[69]: (4,)
1d 跨步,或从一个元素步进到下一个元素,为 4 个字节(一个元素的长度)。从一行到下一行的步长是原始的 2 个元素,即 2*4 字节。
as_strided 产生一个视图。因此,更改其中的元素将影响原始元素,并可能更改重叠值。添加.copy()进行复制;跨步数组的数学运算也会产生一个副本。
更改步幅可以得到不重叠的行 - 但要注意形状 - 可以访问原始数据缓冲区之外的值。
In [82]: ast(A,shape=[4,3],strides=(12,4))
Out[82]:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 17]])
In [84]: ast(A,shape=[3,3],strides=(16,4))
Out[84]:
array([[ 1, 2, 3],
[ 5, 6, 7],
[ 9, 10, 11]])
编辑
一个新函数提供了一个更安全的as_strided 版本。
np.lib.strided_tricks.sliding_window_view(np.arange(1,10),3)[::2]