如何从NumPy数组中删除所有元素的出现?

3
标题已经非常明显了: 我有一个像这样的numpy数组(假设为ints)[ 1 2 10 2 12 2 ],我想要删除所有的2,使得剩余的数组为[ 1 10 12 ]。最好能够尽可能快地完成,因为我使用的是相对较大的数组。
NumPy有一个名为numpy.delete()的函数,但它需要将索引作为参数,而我没有。
编辑:问题确实不同于使用条件检查从numpy数组中删除某些元素,我想这是一个更“一般”的情况。然而,从数组中删除出现的元素的想法是足够基本的,值得提出一个专门的问题,所以我保留这个问题。
3个回答

7
您可以使用索引:
arr = np.array([1, 2, 10, 2, 12, 2])
print(arr[arr != 2])
# [ 1 10 12]

时机非常合适:

from timeit import Timer

arr = np.array(range(5000))
print(min(Timer(lambda: arr[arr != 4999]).repeat(500, 500)))
# 0.004942436999999522

@Georgy 这不是重复的。原帖作者正在使用numpy数组。 - DeepSpace
你打开链接了吗? - Georgy
@Georgy,我打开了你在问题评论中的链接。只有你重复的问题中的第10个答案涉及到numpy。 - DeepSpace
谢谢您的回答!我也对语法感到困惑,您能否澄清一下?我们是使用掩码、过滤还是映射... - mlg556
@mlg556 这是掩码操作,请尝试运行 print(arr == 2) 并查看返回结果。 - DeepSpace

3
你可以使用另一个 numpy 函数。它是 numpy.setdiff1d(ar1, ar2, assume_unique=False)。该函数可以找到两个数组的差集。
import numpy as np
a = np.array([1, 2, 10, 2,12, 2])
b = np.array([2])
c = np.setdiff1d(a,b,True)
print(c)

1

有几种方法可以实现这个功能。我建议您使用掩码:

import numpy as np
a = np.array([ 1, 2 ,10, 2, 12, 2 ])
a[~np.isin(a, 2)]
>> array([ 1, 10, 12])

np.isin 很方便,因为如果需要,你可以将过滤器同时应用于多个元素:

a[~np.isin(a, (1,2))]
>>  array([ 10, 12])

还要注意,a[mask]是原始数组的切片。这样做可以节省内存;但如果你需要创建一个新的数组并保留原始值不变,请使用.copy,例如:

b = a[~np.isin(a, (1,2))].copy()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接