![](/img/trans.png)
[英]Most efficient way to test whether each element from one array exists in a another array, using numpy
[英]Efficient way to delete elements in one numpy array from another
從另一個numpy數組中刪除元素的最佳方法是什么? 基本上我是在np.delete()
,其中數組的順序無關緊要。
import numpy as np
a = np.array([2,1,3])
print a
b = np.array([4,1,2,5,2,3])
b = np.delete(b, a) # doesn't work as desired
print b # want [4,5,2]
迭代a
的元素對於大型數組來說非常慢。
這是一種使用sorting
的方法 -
def remove_first_match(a,b):
sidx = b.argsort(kind='mergesort')
unqb, idx = np.unique(b[sidx],return_index=1)
return np.delete(b,sidx[idx[np.in1d(unqb,a)]])
樣品運行 -
In [177]: a = np.array([2,1,3])
...: b = np.array([4,1,2,5,2,3,2,3])
...:
In [178]: remove_first_match(a,b)
Out[178]: array([4, 5, 2, 2, 3])
In [179]: a = np.array([2,2,1,3])
...: b = np.array([4,5])
...:
In [180]: remove_first_match(a,b)
Out[180]: array([4, 5])
您可以使用np.argmax
查找沿一組行或列的第一個True元素。 因此,例如,您可以通過以下方式執行此操作的廣播版本:
>>> a = np.array([2,1,3])
>>> b = np.array([4,1,2,5,2,3])
>>> np.delete(b, np.argmax(b == a[:, np.newaxis], axis=1))
array([4, 5, 2])
當然,與許多numpy向量化操作一樣,速度是以分配大小len(a) * len(b)
的數組為代價的,因此根據您的輸入,這可能不合適。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.