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
fromnumpy.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]]])