Skip to content Skip to sidebar Skip to footer

Numpy - Ndarray - How To Remove Rows Based On Another Array

I want to remove rows from a ndarray based on another array. for example: k = [1,3,99] n = [ [1,'a'] [2,'b'] [3,'c'] [4,'c'] [.....] [99, 'a'] [100,'e'] ] expect re

Solution 1:

You can use np.in1d to create a mask of matches between the first column of n and k and then use the inverted mask to select the non-matching rows off n, like so -

n[~np.in1d(n[:,0].astype(int), k)]

If the first column is already of int dtype, skip the .astype(int) conversion step.

Sample run -

In [41]: n
Out[41]: 
array([['1', 'a'],
       ['2', 'b'],
       ['3', 'c'],
       ['4', 'c'],
       ['99', 'a'],
       ['100', 'e']], 
      dtype='|S21')

In [42]: k
Out[42]: [1, 3, 99]

In [43]: n[~np.in1d(n[:,0].astype(int), k)]
Out[43]: 
array([['2', 'b'],
       ['4', 'c'],
       ['100', 'e']], 
      dtype='|S21')

For peformance, if the first column is sorted, we can use np.searchsorted -

mask = np.ones(n.shape[0],dtype=bool)
mask[np.searchsorted(n[:,0], k)] = 0
out = n[mask]

Solution 2:

If your data structure is list, please find simple solution as below, however you can convert into list by list() method.

def check(list):
 k=[1,3,99]
 if(list[0] not in k): 
  return list

final_list = map(check,n)
final_list = final_list.remove(None)
print final_list

Post a Comment for "Numpy - Ndarray - How To Remove Rows Based On Another Array"