我有一个数组“ 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中有一个简单的方法可以解决这个问题,但是我在纪录片中找不到它。
答案 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倍。