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"