首页 文章

numpy替换数组中的负值

提问于
浏览
70

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

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

例如

a = array([1, 2, 3, -4, 5])

我需要回来

[1, 2, 3, 0, 5]

a < 0 给出:

[False, False, False, True, False]

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

5 回答

  • 111

    这是一种在没有numpy的情况下在Python中完成它的方法 . 创建一个返回所需内容的函数,并使用列表推导或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]
    
  • 78

    你在那里 . 尝试:

    In [4]: a[a < 0] = 0
    
    In [5]: a
    Out[5]: array([1, 2, 3, 0, 5])
    
  • 8

    试试 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 用于简单操作,因为它是自我记录的,但他的答案更适合更复杂的操作 .

  • 3

    另一个不使用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]
    
  • 2

    另一种可能性:

    In [2]: a = array([1, 2, 3, -4, 5])
    
    In [3]: where(a<0, 0, a)
    Out[3]: array([1, 2, 3, 0, 5])
    

相关问题