Home > front end >  Divide a 2d numpy in 3D according to a window of size w and a step p
Divide a 2d numpy in 3D according to a window of size w and a step p

Time:01-04

I can do it with a loop but it takes me forever. Is there a way to do it without a loop or much faster? Here is my code explained. "data" is my 2D-array (M, N). "seq" is my window size (e.g., 40) and size = data.shape[0] = M.

X = list()
for j in range(size):
    end_idx = j   seq
    if end_idx >= size:
        break

    seq_x = data[j:end_idx, :]
    X.append(seq_x)

final_data = np.array(X)

It will look like below:

data = [[0, 1]
        [2, 3]
        [3, 4]
        [4, 5]
        [5, 6]
        [6, 7]
        [7, 8]
        [8, 9]
        [9, 7]]

For a window of size w = 2 we have

res  = [[[0, 1]
        [2, 3]]
        
        [[2, 3]
        [3, 4]]

        [[3, 4]
        [4, 5]]

        ...

        [[8, 9]
        [9, 7]]]

Is any one as an idea of how to do it so that it can be executed quickly?

CodePudding user response:

import numpy as np

data = np.array([[0, 1],
                 [2, 3],
                 [3, 4],
                 [4, 5],
                 [5, 6],
                 [6, 7],
                 [7, 8],
                 [8, 9],
                 [9, 7]])

w = 2
window_width = data.shape[1]

out = np.lib.stride_tricks.sliding_window_view(data, window_shape=(w, window_width)).squeeze()

out:

array([[[0, 1],
        [2, 3]],

       [[2, 3],
        [3, 4]],

       ...

       [[7, 8],
        [8, 9]],

       [[8, 9],
        [9, 7]]])
  • Related