使用Python / Numpy`as_strided`从非重叠序列有效创建重叠补丁

时间:2018-10-21 14:56:38

标签: python numpy

我有一个2-d形状为NxM的numpy数组,它表示来自M个不同序列的N个连续样本。我需要提供L个样本(L << M)的补丁,以2-d numpy数组的形式覆盖整个数据集。仅复制所有补丁,就无法建立新的数据集。

如果只有一个序列,那么使用as_strided技巧在不复制任何数据的情况下生成重叠补丁将非常简单:

patches = np.lib.stride_tricks.as_strided(data, shape(N*M-L+1,L), strides=(8,8))

这种处理我的数据的方法的问题在于,它会产生重叠单独序列的补丁。

我还可以看到如何使用类似的方法生成形状为N,M-L+1,L的3-d数组:

patches = np.lib.stride_ticks.as_strided(data, shape(N,M-L+1,L), strides=(8*M,8,8))

这会产生正确的补丁,但是我不确定如何将前两个维折叠为一个。

显然有几个与as_strided相关的SO答案,但我找不到满足这些特定要求的答案。

任何想法都值得赞赏。

编辑:以下是简短示例

这里是一个使用as_strided组成几乎完成任务的3-d数组的示例:

>>> a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
>>> a 
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
>>> b = np.lib.stride_tricks.as_strided(a, shape=(3, 3, 2), strides=(32,8,8))
>>> b 
array([[[ 1,  2],
        [ 2,  3],
        [ 3,  4]],

       [[ 5,  6],
        [ 6,  7],
        [ 7,  8]],

       [[ 9, 10],
        [10, 11],
        [11, 12]]])
>>>

按照@Divakar的建议,尝试将此3-d数组展平为2-d的问题是,重塑会生成正确的数据,但这样做会产生一个副本,该副本会为实际的实际问题:

>>> c = b.reshape(-1,b.shape[-1])
>>> c
array([[ 1,  2],
       [ 2,  3],
       [ 3,  4],
       [ 5,  6],
       [ 6,  7],
       [ 7,  8],
       [ 9, 10],
       [10, 11],
       [11, 12]])
>>> b[0][0][0] = 9999
>>> c
array([[ 1,  2],
       [ 2,  3],
       [ 3,  4],
       [ 5,  6],
       [ 6,  7],
       [ 7,  8],
       [ 9, 10],
       [10, 11],
       [11, 12]])
>>>

0 个答案:

没有答案