如何删除numpy数组中的特定元素

我怎样才能从一个numpy数组中删除一些特定的元素? 说我有

import numpy as np a = np.array([1,2,3,4,5,6,7,8,9]) 

我然后想要删除3,4,7 。 我所知道的是价值的指数( index=[2,3,6] )。

使用numpy.delete() – 返回一个新的数组,沿着删除一个轴的子数组

 numpy.delete(a, index) 

对于你的具体问题:

 import numpy as np a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) index = [2, 3, 6] new_a = np.delete(a, index) print(new_a) #Prints `[1, 2, 5, 6, 8, 9]` 

请注意, numpy.delete()返回一个新的数组,因为数组标量是不可变的,与Python中的string类似,所以每次对其进行更改时,都会创build一个新对象。 也就是说,引用delete() 文档 :

删除了obj指定的元素的副本请注意删除不会在原地发生 ……”

如果我发布的代码有输出,这是运行代码的结果。

Numpy数组是不可变的 ,这意味着你在技术上不能从它删除一个项目。 不过,你可以构造一个没有你不想要的值的数组,像这样:

 b = np.delete(a, [2,3,6]) 

有一个numpy的内置函数来帮助。

 import numpy as np >>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> b = np.array([3,4,7]) >>> c = np.setdiff1d(a,b) >>> c array([1, 2, 5, 6, 8, 9]) 

不是一个粗暴的人,我用了一个镜头:

 >>> import numpy as np >>> import itertools >>> >>> a = np.array([1,2,3,4,5,6,7,8,9]) >>> index=[2,3,6] >>> a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))]))) >>> a array([1, 2, 5, 6, 8, 9]) 

根据我的testing,这胜过了numpy.delete() 。 我不知道为什么会这样,也许是由于初始数组的小尺寸?

 python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))" 100000 loops, best of 3: 12.9 usec per loop python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "np.delete(a, index)" 10000 loops, best of 3: 108 usec per loop 

这是一个非常显着的差异(与我所期待的方向相反),任何人都有任何想法,为什么会这样?

更奇怪的是,传递numpy.delete()列表的行为比循环遍历列表更糟糕,并给它单个索引。

 python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "for i in index:" " np.delete(a, i)" 10000 loops, best of 3: 33.8 usec per loop 

编辑:它似乎是做与数组的大小。 对于大数组, numpy.delete()显着更快。

 python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))" 10 loops, best of 3: 200 msec per loop python -m timeit -s "import numpy as np" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "np.delete(a, index)" 1000 loops, best of 3: 1.68 msec per loop 

很显然,这是非常不相干的,因为你应该总是清楚,避免重新发明轮子,但是我觉得它有点有趣,所以我想我会把它留在这里。