标题很不言自明:我有一个numpy数组,例如(假设是ints)
[ 1 2 10 2 12 2 ]
,我想删除所有出现的2
,因此结果数组为[ 1 10 12 ]
。最好是我希望尽快执行此操作,因为我使用的是相对较大的数组。
NumPy具有一个名为numpy.delete()
的函数,但它将索引作为参数,而我没有。
编辑:问题确实与Deleting certain elements from numpy array using conditional checks不同,我猜这是一个更“一般”的情况。但是,从数组中删除出现的想法足够基础,值得提出自己的明确问题,因此我保留该问题。
答案 0 :(得分:2)
您可以使用另一个numpy函数,它是numpy.setdiff1d(ar1,ar2,假定_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 :(得分:1)
您可以使用索引:
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
答案 2 :(得分: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()