2016-11-16 68 views
2

從另一個numpy數組中刪除元素的最佳方法是什麼?基本上,我在np.delete()之後,其中數組的順序無關緊要。從另一個numpy數組中刪除元素的有效方法

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的元素進行迭代。

+0

你爲什麼要'[4,5,2]'? '2'也在'a'中,所以它應該被刪除,'b'將會被'[4,5]'。 – Evert

+0

@Evert我想只刪除'a'中元素的第一個實例。正如書面的'a'有兩個'2'。 –

+0

那麼如果'a = [2,2,1,3]','b == [4,5]'?如果'a = [2,2,2,1,3]'怎麼辦?你的情況目前不具體。 – Evert

回答

1

下面是一個使用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]) 
1

您可以使用np.argmax找到沿設定的行或列的第一個真正的元素。因此,舉例來說,你可以做這個操作的播出版本是這樣的:

>>> 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)的陣列的成本,所以要根據在您的意見中,這可能不合適。

相關問題