2017-08-18 91 views
4

我会使用NumPy或原生函数将2d数组转换为3d与前一行。将2D阵列变换为重叠大步的3D阵列

输入:

[[1,2,3], 
[4,5,6], 
[7,8,9], 
[10,11,12], 
[13,14,15]] 

输出:

[[[7,8,9], [4,5,6], [1,2,3]], 
[[10,11,12], [7,8,9], [4,5,6]], 
[[13,14,15], [10,11,12], [7,8,9]]] 

任何一个可以帮助? 我在网上搜索了一段时间,但无法得到答案。

+2

我想我明白你想要什么,但它与你在问题中写下的内容没有任何关系。到目前为止你做了什么?请发布您的代码。 – DyZ

+1

@DYZ不确定混淆的地方。 OP已经列出了2D输入和预期的3D输出,该输出具有从2D输入中拾取的行,这些行是当前的行和先前的行,再次列出在期望的输出中。 – Divakar

回答

5

方法#1

一个与np.lib.stride_tricks.as_strided做法,给了我们一个view到输入2D阵列,因此不会占用了内存空间 -

L = 3 # window length for sliding along the first axis 
s0,s1 = a.strides 

shp = a.shape 
out_shp = shp[0] - L + 1, L, shp[1] 
strided = np.lib.stride_tricks.as_strided 
out = strided(a[L-1:], shape=out_shp, strides=(s0,-s0,s1)) 

样品输入,输出 -

In [43]: a 
Out[43]: 
array([[ 1, 2, 3], 
     [ 4, 5, 6], 
     [ 7, 8, 9], 
     [10, 11, 12], 
     [13, 14, 15]]) 

In [44]: out 
Out[44]: 
array([[[ 7, 8, 9], 
     [ 4, 5, 6], 
     [ 1, 2, 3]], 

     [[10, 11, 12], 
     [ 7, 8, 9], 
     [ 4, 5, 6]], 

     [[13, 14, 15], 
     [10, 11, 12], 
     [ 7, 8, 9]]]) 

方法2

或者,在生成所有行索引的有点容易用一个broadcasting -

In [56]: a[range(L-1,-1,-1) + np.arange(shp[0]-L+1)[:,None]] 
Out[56]: 
array([[[ 7, 8, 9], 
     [ 4, 5, 6], 
     [ 1, 2, 3]], 

     [[10, 11, 12], 
     [ 7, 8, 9], 
     [ 4, 5, 6]], 

     [[13, 14, 15], 
     [10, 11, 12], 
     [ 7, 8, 9]]]) 
3

如何列表理解?

In [144]: np.array([l[i:i + 3][::-1] for i in range(0, len(l) - 2)]) 
Out[144]: 
array([[[ 7, 8, 9], 
     [ 4, 5, 6], 
     [ 1, 2, 3]], 

     [[10, 11, 12], 
     [ 7, 8, 9], 
     [ 4, 5, 6]], 

     [[13, 14, 15], 
     [10, 11, 12], 
     [ 7, 8, 9]]])