Python 删除数组中的所有负值

18 投票
4 回答
43336 浏览
提问于 2025-04-18 02:53

如何高效地从一个数组中去掉负数元素呢?我试过用 numpy.delete去掉数组中特定的值,还有像 x[x != i] 这样的代码。

例如:

import numpy as np
x = np.array([-2, -1.4, -1.1, 0, 1.2, 2.2, 3.1, 4.4, 8.3, 9.9, 10, 14, 16.2])

我想得到一个这样的数组:

[0, 1.2, 2.2, 3.1, 4.4, 8.3, 9.9, 10, 14, 16.2]

4 个回答

3

我觉得用numpy来做这个事情可能有很酷的方法,因为对我来说,numpy就像魔法一样。不过:

x = np.array( [ num for num in x if num >= 0 ] )
5

在numpy中:

b = array[array>=0]

举个例子:

>>> import numpy as np
>>> arr = np.array([-2, -1.4, -1.1, 0, 1.2, 2.2, 3.1, 4.4, 8.3, 9.9, 10, 14, 16.2])
>>> arr = arr[arr>=0]
>>> arr
array([  0. ,   1.2,   2.2,   3.1,   4.4,   8.3,   9.9,  10. ,  14. ,  16.2])
6

如果性能很重要,你可以利用你的 np.array 已经排好序这个特点,使用 numpy.searchsorted 来提高效率。

举个例子:

In [8]: x[np.searchsorted(x, 0) :]
Out[8]: array([  0. ,   1.2,   2.2,   3.1,   4.4,   8.3,   9.9,  10. ,  14. ,  16.2])

In [9]: %timeit x[np.searchsorted(x, 0) :]
1000000 loops, best of 3: 1.47 us per loop

In [10]: %timeit x[x >= 0]
100000 loops, best of 3: 4.5 us per loop

随着数组大小的增加,性能差异会变得更加明显,因为 np.searchsorted 使用的是二分查找,效率是 O(log n),而 x >= 0 使用的是线性查找,效率是 O(n)。

In [11]: x = np.arange(-1000, 1000)

In [12]: %timeit x[np.searchsorted(x, 0) :]
1000000 loops, best of 3: 1.61 us per loop

In [13]: %timeit x[x >= 0]
100000 loops, best of 3: 9.87 us per loop
46

在编程中,有时候我们会遇到一些问题,想要找到解决办法。StackOverflow是一个很棒的平台,大家可以在这里提问和回答问题。你可以把它想象成一个大型的问答社区,里面有很多经验丰富的程序员,他们乐于分享自己的知识和经验。

当你在StackOverflow上提问时,记得描述清楚你的问题,这样别人才能更好地理解你的困惑,给出有效的建议。通常,问题的描述应该包括你遇到的具体情况、你尝试过的解决方法,以及你希望达到的目标。

如果你看到别人提问,记得也可以帮助他们,分享你的见解和解决方案。这样不仅能帮助他人,也能加深你自己的理解。

总之,StackOverflow是一个学习和交流的好地方,适合所有想要提升编程技能的人。

In [2]: x[x >= 0]
Out[2]: array([  0. ,   1.2,   2.2,   3.1,   4.4,   8.3,   9.9,  10. ,  14. ,  16.2])

撰写回答