Replace negative values in an numpy array

前端 未结 5 936
小蘑菇
小蘑菇 2020-12-04 20:47

Is there a simple way of replacing all negative values in an array with 0?

I\'m having a complete block on how to do it using a NumPy array.

E.g.



        
相关标签:
5条回答
  • 2020-12-04 21:02

    Try 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])
    

    You can clip only the bottom half with clip(0).

    >>> a = numpy.array([1, 2, 3, -4, 5])
    >>> a.clip(0)
    array([1, 2, 3, 0, 5])
    

    You can clip only the top half with clip(max=n). (This is much better than my previous suggestion, which involved passing NaN to the first parameter and using out to coerce the type.):

    >>> a.clip(max=2)
    array([ 1,  2,  2, -4,  2])
    

    Another interesting approach is to use where:

    >>> numpy.where(a <= 2, a, 2)
    array([ 1,  2,  2, -4,  2])
    

    Finally, consider aix's answer. I prefer clip for simple operations because it's self-documenting, but his answer is preferable for more complex operations.

    0 讨论(0)
  • 2020-12-04 21:08

    Another minimalist Python solution without using numpy:

    [0 if i < 0 else i for i in a]
    

    No need to define any extra functions.

    a = [1, 2, 3, -4, -5.23, 6]
    [0 if i < 0 else i for i in a]
    

    yields:

    [1, 2, 3, 0, 0, 6]
    
    0 讨论(0)
  • 2020-12-04 21:14

    Here's a way to do it in Python without NumPy. Create a function that returns what you want and use a list comprehension, or the map function.

    >>> 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]
    
    0 讨论(0)
  • 2020-12-04 21:23

    You are halfway there. Try:

    In [4]: a[a < 0] = 0
    
    In [5]: a
    Out[5]: array([1, 2, 3, 0, 5])
    
    0 讨论(0)
  • 2020-12-04 21:27

    And yet another possibility:

    In [2]: a = array([1, 2, 3, -4, 5])
    
    In [3]: where(a<0, 0, a)
    Out[3]: array([1, 2, 3, 0, 5])
    
    0 讨论(0)
提交回复
热议问题