簡體   English   中英

從一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM