Convert a 2D array to a 3D array with overlapping steps

I would convert a 2d array to 3d with previous lines using NumPy or native functions.

Input:

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

Output:

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

Anyone can help? I searched the Internet for a while, but did not get an answer.

+4
source share
2 answers

Approach No. 1

One approach with np.lib.stride_tricks.as_strided , which gives us a view into a 2D input array and, as such, does not take up more memory space -

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

Example input, output -

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

Approach # 2

Alternatively, a bit easier with broadcasting after generating all row indices -

 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]]]) 
+5
source

How about a list comprehension?

 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]]]) 
+3
source

Source: https://habr.com/ru/post/1274888/


All Articles