删除数组中另一个数组中的所有数字

时间:2019-02-05 14:47:36

标签: python arrays numpy

我有一个数组“ removable”,其中包含一些数字,而另一个数组“ All”则包含从0到k的所有数字。

我要删除“所有”中可移动列出的数字。

All = np.arange(k)
removable = np.ndarray([1, 3, 4 , 7, 9, ..., 200])

for i in removable:
    if i in All:
        All.remove(i)

ndarray没有remove属性,但是我确定numpy中有一个简单的方法可以解决这个问题,但是我在纪录片中找不到它。

5 个答案:

答案 0 :(得分:5)

您可以使用NumPy中的函数setdiff1d

>>> a = np.array([1, 2, 3, 2, 4, 1])
>>> b = np.array([3, 4, 5, 6])
>>> np.setdiff1d(a, b)
array([1, 2])

答案 1 :(得分:2)

np.setdiff1d()将删除原始条目的重复数据,并返回排序后的结果。

在某些情况下还可以,但是如果您想避免这两个方面中的一个或两个,请使用{(1)布尔掩码({inverted)”)来看看np.in1d()

>>> a = np.array([1, 2, 3, 2, 4, 1])                                                                                                                                                                                                                    
>>> b = np.array([3, 4, 5, 6])                                                                                                                                                                                                                          
>>> a[~np.in1d(a, b)]                                                                                                                                                                                                                                   
array([1, 2, 2, 1])

~运算符对布尔掩码进行反转:

>>> np.in1d(a, b)                                                                                                                                                                                                                                       
array([False, False,  True, False,  True, False])

>>> ~np.in1d(a, b)                                                                                                                                                                                                                                      
array([ True,  True, False,  True, False,  True])

免责声明:

请注意,这并不是真正的删除,正如您在问题中指出的那样;结果是view进入原始数组a的过滤元素。 np.delete()也是如此;没有NumPy数组的就地元素删除的概念。

答案 2 :(得分:1)

解决方案-快速处理大型数组,无需转换为列表(减慢计算速度)

orig=np.arange(15)
to_remove=np.array([1,2,3,4])
mask = np.isin(orig, to_remove)
orig=orig[np.invert(mask)]

>>> orig
array([ 0,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

答案 3 :(得分:-1)

numpy数组具有固定的形状,您无法从其中删除元素。

您不能使用ndarrays完成此操作。

答案 4 :(得分:-1)

您应该使用集合而不是列表/数组来完成此操作,这很容易:

remaining = np.array(set(arr).difference(removable))

其中arr是上方的All数组(“ all”是关键字,不应覆盖)。

如果在arr中包含元素,则使用集会摆脱重复的元素,但听起来arr只是一系列唯一值。集合具有更高效率的成员资格检查(恒定时间与N阶),因此您可以更快地进行操作。相比之下,我制作了一个列表版本,如果removable中的值是 not ,则构建一个列表:

def remove_list(arr, rem):
    result = []
    for i in arr:
        if i not in rem:
            result.append(i)
    return result

并使我的设置版本也具有功能:

def remove_set(arr, rem):
    return np.array(set(arr).difference(rem))

arr = np.arange(10000)removable = np.random.randint(0, 10000, 1000)的时间比较:

remove_list(arr, removable)
# 55.5 ms ± 664 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

remove_set(arr, removable)
# 947 µs ± 3.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

设置快50倍。