numpy替换数组中的负值

bph*_*bph 79 python numpy

任何人都可以建议用0替换数组中的所有负值的简单方法吗?

我正在使用numpy数组完成一个完整的块

例如

a = array([1, 2, 3, -4, 5])
Run Code Online (Sandbox Code Playgroud)

我需要回来

[1, 2, 3, 0, 5]
Run Code Online (Sandbox Code Playgroud)

a < 0 得到:

[False, False, False, True, False]
Run Code Online (Sandbox Code Playgroud)

这就是我被困的地方 - 如何使用这个数组来修改原始数组

NPE*_*NPE 124

你在那里.尝试:

In [4]: a[a < 0] = 0

In [5]: a
Out[5]: array([1, 2, 3, 0, 5])
Run Code Online (Sandbox Code Playgroud)


sen*_*rle 84

试试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])
Run Code Online (Sandbox Code Playgroud)

你可以只用下半部分剪辑clip(0).

>>> a = numpy.array([1, 2, 3, -4, 5])
>>> a.clip(0)
array([1, 2, 3, 0, 5])
Run Code Online (Sandbox Code Playgroud)

你可以只剪辑上半部分clip(max=n).(这比我之前的建议要好得多,其中涉及传递NaN给第一个参数并使用out强制类型.):

>>> a.clip(max=2)
array([ 1,  2,  2, -4,  2])
Run Code Online (Sandbox Code Playgroud)

另一个有趣的方法是使用where:

>>> numpy.where(a <= 2, a, 2)
array([ 1,  2,  2, -4,  2])
Run Code Online (Sandbox Code Playgroud)

最后,考虑一下艾克斯的回答.我更喜欢clip简单的操作,因为它是自我记录的,但他的答案更适合更复杂的操作.


Lev*_*von 9

另一个不使用numpy的极简主义Python解决方案:

[0 if i < 0 else i for i in a]
Run Code Online (Sandbox Code Playgroud)

无需定义任何额外功能.

a = [1, 2, 3, -4, -5.23, 6]
[0 if i < 0 else i for i in a]
Run Code Online (Sandbox Code Playgroud)

收益率:

[1, 2, 3, 0, 0, 6]
Run Code Online (Sandbox Code Playgroud)

  • @Hiett只是在列表推导中使用三元运算符(C中的“ i &lt;0?0:i”)。放在方括号中以使其更清楚`[[(如果i &lt;0,则为0,否则i)为a中的i]。如果将if放在后面,则使用列表表达式构造的过滤器部分。“如果i &lt;0,则i中的[[i],只会返回小于零的项列表”。 (2认同)
  • Numpy功能强大,因为它通过编译的C代码执行大量计算,因此速度更快。与其他方法相比,我发现速度因子差异几乎是10倍(这是较慢的)。因此,尽管直观且易于阅读,但这绝对不是计算密集型的。 (2认同)