首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何删除numpy数组中的特定元素

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

Stack Overflow用户
提问于 2012-06-12 19:54:38
回答 8查看 654.6K关注 0票数 283

如何从numpy数组中删除一些特定的元素?假设我有

代码语言:javascript
运行
复制
import numpy as np

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

然后我想从a中删除3,4,7。我只知道值的索引(index=[2,3,6])。

EN

回答 8

Stack Overflow用户

发布于 2016-04-07 03:33:33

有一个numpy内置函数可以帮助你做到这一点。

代码语言:javascript
运行
复制
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])
票数 93
EN

Stack Overflow用户

发布于 2019-04-26 17:43:13

要按值删除:

代码语言:javascript
运行
复制
modified_array = np.delete(original_array, np.where(original_array == value_to_delete))
票数 30
EN

Stack Overflow用户

发布于 2012-06-12 20:06:15

不是一个麻木的人,我尝试了一下:

代码语言:javascript
运行
复制
>>> 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])

根据我的测试,它的性能优于numpy.delete()。我不知道为什么会出现这种情况,可能是因为初始数组太小了?

代码语言:javascript
运行
复制
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()传递一个列表比遍历列表并为其提供单个索引的性能更差。

代码语言:javascript
运行
复制
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()的速度要快得多。

代码语言:javascript
运行
复制
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

显然,这一切都是非常无关紧要的,因为你应该总是追求清晰,避免重复发明轮子,但我发现它有点有趣,所以我想我把它留在这里。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10996140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档