3

我正在尝试使用函数as_stridedfromnumpy.lib.stride_tricks从更大的二维数组中提取子系列,但我很难找到正确的东西来写strides参数。

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

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(效率)

4

1 回答 1

2

这是一种方法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]]])
于 2017-06-01T11:26:08.947 回答