Search code examples
pythonarraysnumpyglobalrowdeleting

numpy delete not deleting the rows from arrays


I am trying to perform the following: I generate 4 4 by 4 arrays with random values: scan_plus_1 ... scan_plus_4

Next I want to remove rows from each of the previously generated arrays using the numpy.delete funtion. Rows should be deleted using the Offset_Left_Pos array; for instance, for scan_plus_1 rows starting from 0 to 2 should be removed, for scan_plus_2 rows starting from 0 to 1 should be reomoved and so on.

The code is removing rows but not the rows I want it to remove i.e. the first 0 to Offset_Left_Pos[n]rows.

Could you please let me know what is it that I am doing wrong here, or if you have a better solution for this problem?

Thanks in advance.

import numpy as np

Offsets_Left_Pos=[2,1,1,2]

scanlines_pos=[8, 6, 7, 3]

 

Range_SL=range(0,len(scanlines_pos),1)

 

for sl_count in Range_SL:

    #globals()["scan_plus_" + str(sl_count + 1)] = np.zeros((4, 4))

    globals()["scan_plus_" + str(sl_count + 1)] = np.random.rand(4,4)

 

for sl_count in Range_SL:

 

    globals()["Xscan_plus_" + str(sl_count + 1)] = eval("np.delete("+"scan_plus_" + str(sl_count + 1)+",[0, Offsets_Left_Pos[sl_count]],axis=0)")  # Delete first offsets components of array

    #globals()["Xscan_plus_" + str(sl_count + 1)] = np.delete(eval("scan_plus_" + str(sl_count + 1)),(0,Offsets_Left_Pos[sl_count]),axis=0)  # Delete first offsets components of array

 

 

print("scan_plus_1")

print(scan_plus_1)

 

print("Xscan_plus_1")

print(Xscan_plus_1)

Solution

  • Please:

    • Do not use globals() to generate variables names, use lists instead
    • Do not use eval
    • Do use snake_case convention

    Regarding your error, it is because you didn't provide all the indices you wanted to deleted, but only the minimum and maximum indices. You should provide a range using np.arange.

    Edit: Another, better solution, is just to index the array. Indeed arr[start_idx:] will effectively delete all rows before start_idx.

    from pprint import pprint
    import numpy as np
    
    offsets_left_pos = [2, 1, 1, 2]
    scanlines_pos = [8, 6, 7, 3]
    
    range_sl = range(len(scanlines_pos))
    
    scan_plus = []
    for sl_count in range_sl:
        scan_plus_sl_count = np.arange(16).reshape(4, 4)
        scan_plus.append(scan_plus_sl_count)
    
    Xscan_plus = []
    for sl_count in range_sl:
        # idxs_to_delete = np.arange(offsets_left_pos[sl_count])
        # Xscan_plus_sl_count = np.delete(scan_plus[sl_count], idxs_to_delete, axis=0)
        # Better for this simple case
        Xscan_plus_sl_count = scan_plus[sl_count][offsets_left_pos[sl_count] : ]
        Xscan_plus.append(Xscan_plus_sl_count)
    
    print("scan_plus")
    pprint(scan_plus)
    
    print("\nXscan_plus")
    pprint(Xscan_plus)
    

    Prints:

    scan_plus
    [array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]]),
     array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]]),
     array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]]),
     array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])]
    
    Xscan_plus
    [array([[ 8,  9, 10, 11],
           [12, 13, 14, 15]]),
     array([[ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]]),
     array([[ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]]),
     array([[ 8,  9, 10, 11],
           [12, 13, 14, 15]])]