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