沿着2D阵列的最后一个轴滑动窗口,使用NumPy步长给出3D阵列

时间:2017-06-01 11:13:04

标签: python arrays numpy stride

我正在尝试使用as_strided中的函数numpy.lib.stride_tricks从更大的2D数组中提取子系列,但我很难找到为strides参数编写的正确的东西。

假设我有一个矩阵m,它包含5个1D长度数组(a=)10。我想为b=中的每个1D数组提取长度为m)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获得了正确的形状。但是我无法在strides=()

中找到要写的内容

有关信息:

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]]
        ]

编辑:我有更多数据,这就是我想使用as_strided(效率)的原因

1 个答案:

答案 0 :(得分:1)

这是np.lib.stride_tricks.as_strided -

的一种方法
def strided_lastaxis(a, L):
    s0,s1 = a.strides
    m,n = a.shape
    return np.lib.stride_tricks.as_strided(a, shape=(m,n-L+1,L), strides=(s0,s1,s1))

有关as_strided的步幅的解释:

我们有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]]])