有没有一种简单的方法将数组中所有负数替换为0?
我完全不知道如何使用NumPy数组来做到这一点。
例如:
a = array([1, 2, 3, -4, 5])
我需要返回
[1, 2, 3, 0, 5]
a < 0
得到:
[False, False, False, True, False]
我现在卡住了 - 如何使用这个数组修改原始数组。
你已经完成了一半,尝试:
In [4]: a[a < 0] = 0
In [5]: a
Out[5]: array([1, 2, 3, 0, 5])
尝试使用 numpy.clip
:
>>> import numpy
>>> a = numpy.arange(-10, 10)
>>> a
array([-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2,
3, 4, 5, 6, 7, 8, 9])
>>> a.clip(0, 10)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
您可以使用 clip(0)
仅裁剪底部一半。>>> a = numpy.array([1, 2, 3, -4, 5])
>>> a.clip(0)
array([1, 2, 3, 0, 5])
您可以使用clip(max=n)
来剪裁顶部一半的内容。(这比我的先前建议要好得多,该建议涉及将NaN
传递给第一个参数并使用out
来强制转换类型。)
>>> a.clip(max=2)
array([ 1, 2, 2, -4, 2])
另一个有趣的方法是使用where
:
>>> numpy.where(a <= 2, a, 2)
array([ 1, 2, 2, -4, 2])
最后,考虑aix的答案。我喜欢使用clip
进行简单操作,因为它是自说明的,但对于更复杂的操作,他的答案更可取。
numpy
?你试过使用a
的clip
方法吗?内置函数numpy.clip
给我报了同样的错误,但是方法却没有。 - senderlea.clip(max=2)
。 - Bi Rico另一种不使用 numpy 的极简 Python 解决方案:
[0 if i < 0 else i for i in a]
不需要定义任何额外的函数。
a = [1, 2, 3, -4, -5.23, 6]
[0 if i < 0 else i for i in a]
产生:[1, 2, 3, 0, 0, 6]
for
之前会将其应用于列表的每个元素,将其放在之后意味着只有在满足条件时才会进入结果列表。 - Levoni < 0 ? 0 : i
)。加上括号可以使其更清晰:[(0 if i < 0 else i) for i in a]
。将if放在后面是使用列表表达式结构的过滤器部分。[(i) for i in a if i < 0]
只会返回小于零的项目列表。 - Paul S还有一种可能性:
In [2]: a = array([1, 2, 3, -4, 5])
In [3]: where(a<0, 0, a)
Out[3]: array([1, 2, 3, 0, 5])
以下是一种在Python中不使用NumPy的方法。创建一个返回所需结果的函数,使用列表推导或map函数。
>>> a = [1, 2, 3, -4, 5]
>>> def zero_if_negative(x):
... if x < 0:
... return 0
... return x
...
>>> [zero_if_negative(x) for x in a]
[1, 2, 3, 0, 5]
>>> map(zero_if_negative, a)
[1, 2, 3, 0, 5]
使用numpy
进行基准测试:
%%timeit
a = np.random.random(1000) - 0.5
b = np.maximum(a,0)
# 18.2 µs ± 204 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
a = np.random.random(1000) - 0.5
a[a < 0] = 0
# 19.6 µs ± 304 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
a = np.random.random(1000) - 0.5
b = np.where(a<0, 0, a)
# 21.1 µs ± 134 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%%timeit
a = np.random.random(1000) - 0.5
b = a.clip(0)
# 37.7 µs ± 124 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
令人惊讶的是,np.maximum
赢了 @NPE 的答案。
注意:
os[os < 0] = 0
比 np.where()
更快,但不支持 numba
。但无论如何,np.maximum()
是我找到的最快的方法。
np.maximum()
与 np.max()
和 np.amax()
不同。 np.maximum()
可以将 向量
与单个值进行比较。