[SOLVED] Choose 4 number of rows at each step and delete the columns with a condition

Issue

I have an array. At each step, I want to choose four rows of the array and then if row0 =0, row1=-1, row2=-3, and row3=-4, then delete that column. And then, move through that 4 rows array with a sliding window size. If after deleting the columns, the number of column are less than or equal to window size, then move to the next 4-rows. Here is the array that I have:

x = np.array([
          [6, 10, 5,   0,    0, 4, 5],
          [1,  2, 3,  -1,    1, 3, 2],
          [13, 0, 5,  -3,   -3, 1, 2],
          [1,  4, 5,  -4,   -4, 5, 6], 
          
          [0,  0,   0,  0,  0,   1,  2],
          [-1, -1, -1, -1, -1,  3,  4],
          [-3, -3 ,-3, -3,  5,  6,  7],
          [-4, -4 , 4,  3,  6,  7, 8], 

          [0, 0 ,0, 0, 0, 1, 2],
          [-1, -1, -1, -1, -1, 3, 4],
          [-3, -3 ,-3, -3, 5, 6,7],
          [-4, -4 ,-4, -4, 6, 7, 8]
         
         ])

Explain: in the first 4 rows, column 4 has the condition. Then, we delete this column. Then we choose the first sliding window with size 4*3 and move to the right. For the second 4 rows, the columns 1, 2 has the condition and then we choose the sliding window from column 3. The third 4-rows, column 1,2,3,4 have the condition, then we don’t consider this 4 rows at all.

For calculating Y, we choose the first row after the sliding window.
and here is the function which I wrote for calculate the X_new and Y. This function can calculate the value, but it can not delete that column:

def myf(array, w):
    t, z = [], []  
    for i in range(3):
        for cols in range(array.shape[1]-w):
            Xtmp = array[4*i:4*i+4, cols:w+cols]
            t.append(Xtmp)
        
            ztmp =  array[4*i, w+cols]
            z.append(ztmp)
    t = np.asarray(t)
    z = np.asarray(z)
    return t, z

X_new, Y_new = myf(x , 3)

Here is the outputs which I want:

X_new = array([[[ 6, 10,  5],
    [ 1,  2,  3],
    [13,  0,  5],
    [ 1,  4,  5]],

   [[10,  5,  0],
    [ 2,  3, 1],
    [ 0,  5, -3],
    [ 4,  5, -4]],

   [[ 5,  0,  4],
    [ 3, 1, 3],
    [ 5, -3, 1],
    [ 5, -4, 5]],

   [[ 0,  0,  0],
    [-1, -1, -1],
    [-3, -3,  5],
    [ 4,  3,  6]],

   [[ 0,  0,  1],
    [-1, -1,  3],
    [-3,  5,  6],
    [ 3,  6,  7]]])

Y_new = array([0, 4, 5, 1, 2])

Solution

You need to define a dictionary before you move to the second loop. In the second loop, you should read the data from dictionary. Here is:

 def myf(array, w):
    t, z = [], [] 
    dic = {}
    for i in range(3):
        Xf = array[4*i:4*i+4, :]
        dic[i] = Xf[:,~((Xf[0]==0)&(Xf[1]==-1)&(Xf[2]==-3)&(Xf[3]==-4))]
    
        for cols in range(dic[i].shape[1]-w):
            Xtmp = dic[i][:, cols:w+cols]
            t.append(Xtmp)
            ztmp =  dic[i][0, w+cols]
            z.append(ztmp)
    t = np.asarray(t)
    z = np.asarray(z)
    return t, z

X_new, Y_new = myf(x , 3)

Here is X_new:

array([[[ 6, 10,  5],
    [ 1,  2,  3],
    [13,  0,  5],
    [ 1,  4,  5]],

   [[10,  5,  0],
    [ 2,  3,  1],
    [ 0,  5, -3],
    [ 4,  5, -4]],

   [[ 5,  0,  4],
    [ 3,  1,  3],
    [ 5, -3,  1],
    [ 5, -4,  5]],

   [[ 0,  0,  0],
    [-1, -1, -1],
    [-3, -3,  5],
    [ 4,  3,  6]],

   [[ 0,  0,  1],
    [-1, -1,  3],
    [-3,  5,  6],
    [ 3,  6,  7]]])

Answered By – Cheese

Answer Checked By – Timothy Miller (BugsFixing Admin)

Leave a Reply

Your email address will not be published. Required fields are marked *