Python 沿二维阵列的最后一个轴滑动窗口,以使用NumPy步幅生成三维阵列

Python 沿二维阵列的最后一个轴滑动窗口,以使用NumPy步幅生成三维阵列,python,arrays,numpy,stride,Python,Arrays,Numpy,Stride,我试图使用函数as_stripsfromnumpy.lib.stride\u tricks从一个更大的2D数组中提取子序列,但我很难找到为strips参数编写的正确内容 假设我有一个矩阵m,它包含5个长度为1D的数组(a=)10。我想为m中的每个1D数组提取长度为(b=)4的子1D数组 import numpy from numpy.lib.stride_tricks import as_strided a, b = 10, 4 m = numpy.array([range(i,i+a) fo

我试图使用函数
as_strips
from
numpy.lib.stride\u tricks
从一个更大的2D数组中提取子序列,但我很难找到为
strips
参数编写的正确内容

假设我有一个矩阵
m
,它包含5个长度为1D的数组(
a=
)10。我想为
m
中的每个1D数组提取长度为(
b=
)4的子1D数组

import numpy
from numpy.lib.stride_tricks import as_strided

a, b = 10, 4
m = numpy.array([range(i,i+a) for i in range(5)])

# first try
sub_m = as_strided(m, shape=(m.shape[0], m.shape[1]-b+1, b))
print sub_m.shape # (5,7,4) which is what i expected
print sub_m[-1,-1,-1] # Some unexpected strange number: 8227625857902995061

# second try with strides argument
sub_m = as_strided(m, shape=(m.shape[0], m.shape[1]-b+1, b), strides=(m.itemize,m.itemize,m.itemize))
# gives error, see below
AttributeError:'numpy.ndarray'对象没有属性'itemize'

正如您所看到的,我在第一次尝试中成功地获得了
sub\m
的正确形状。但是,我找不到要在
strips=()中编写的内容

有关信息:

m = [[ 0  1  2  3  4  5  6  7  8  9]
 [ 1  2  3  4  5  6  7  8  9 10]
 [ 2  3  4  5  6  7  8  9 10 11]
 [ 3  4  5  6  7  8  9 10 11 12]
 [ 4  5  6  7  8  9 10 11 12 13]]
预期产出:

sub_n = [
         [[0 1 2 3] [1 2 3 4] ... [5 6 7 8] [6 7 8 9]]
         [[1 2 3 4] [2 3 4 5] ... [6 7 8 9] [7 8 9 10]]
         [[2 3 4 5] [3 4 5 6] ... [7 8 9 10] [8 9 10 11]]
         [[3 4 5 6] [4 5 6 7] ... [8 9 10 11] [9 10 11 12]]
         [[4 5 6 7] [5 6 7 8] ... [9 10 11 12] [10 11 12 13]]
        ]
编辑:我有更多的数据,这就是为什么我想使用
作为提高效率的方法-

关于
步幅的一点解释,如_-stride

我们有3D步幅,沿最后一个/第三个轴增加一个元素,因此最后一个轴的跨步是s1。第二个轴以相同的一个元素“距离”移动,因此
s1
也是如此。对于第一个轴,跨步与数组的第一个轴跨步长度相同,因为我们在下一行移动,所以
s0
在那里

样本运行-

In [46]: a
Out[46]: 
array([[0, 5, 6, 2, 3, 6, 7, 1, 4, 8],
       [2, 1, 3, 7, 0, 3, 5, 4, 0, 1]])

In [47]: strided_lastaxis(a, L=4)
Out[47]: 
array([[[0, 5, 6, 2],
        [5, 6, 2, 3],
        [6, 2, 3, 6],
        [2, 3, 6, 7],
        [3, 6, 7, 1],
        [6, 7, 1, 4],
        [7, 1, 4, 8]],

       [[2, 1, 3, 7],
        [1, 3, 7, 0],
        [3, 7, 0, 3],
        [7, 0, 3, 5],
        [0, 3, 5, 4],
        [3, 5, 4, 0],
        [5, 4, 0, 1]]])

预期输出的形状是什么?考虑输入具有形状(m,n),并且您的步长为“代码>L<代码>”。预期输出形状:(5,7,4)(m,n,l),L=m 4+1,也许您的意思是(m,n+l,1,l)?是的,确实。你说得对(与代码中相同)谢谢!它起作用了。然而,我仍然不明白我应该在最后一个论点中说些什么。
(s0、s1、s1)
来自哪里?如果您能补充更多细节,我将不胜感激,这样下次我就不用问了:)@Nuageux衷心道歉,先生!添加评论。非常感谢您的解释,这不是我第一次使用此功能,下次我想我不会了!(附:为什么是先生?)
In [46]: a
Out[46]: 
array([[0, 5, 6, 2, 3, 6, 7, 1, 4, 8],
       [2, 1, 3, 7, 0, 3, 5, 4, 0, 1]])

In [47]: strided_lastaxis(a, L=4)
Out[47]: 
array([[[0, 5, 6, 2],
        [5, 6, 2, 3],
        [6, 2, 3, 6],
        [2, 3, 6, 7],
        [3, 6, 7, 1],
        [6, 7, 1, 4],
        [7, 1, 4, 8]],

       [[2, 1, 3, 7],
        [1, 3, 7, 0],
        [3, 7, 0, 3],
        [7, 0, 3, 5],
        [0, 3, 5, 4],
        [3, 5, 4, 0],
        [5, 4, 0, 1]]])