【问题标题】:Getting the minimum from elements of a Numpy array and a float从 Numpy 数组和浮点数的元素中获取最小值
【发布时间】:2023-03-16 08:55:01
【问题描述】:

问题:我想将 Numpy 数组的每个元素与一个浮点数进行比较,返回一个值较小的数组。例如,使用输入:

import numpy as np
input_a = 3
input_b = np.array([1,2,3,4,5])

输出应该是

output = np.array([1,2,3,3,3])

我当前的解决方案是创建一个仅包含常量的新 np.array,然后使用 np.minimum()。

c = np.copy(input_b)
c.fill(input_a)
output = np.minimum(input_b, c)

但是,恐怕这不是最有效的解决方案。有没有更优雅/更有效的方法来实现这一目标?

【问题讨论】:

    标签: python arrays numpy min


    【解决方案1】:

    我认为np.minimum 适合这个操作:

    >>> np.minimum(input_b, 3)
    array([1, 2, 3, 3, 3])
    

    如果您想直接修改input_b,请使用out 关键字参数将input_b 填充成对的最小值。

    >>> np.minimum(input_b, 3, out=input_b)
    >>> input_b
    array([1, 2, 3, 3, 3])
    

    这比使用布尔索引然后赋值要快:

    >>> %timeit input_b[input_b > input_a] = input_a
    100000 loops, best of 3: 4.16 µs per loop
    
    >>> %timeit np.minimum(input_b, 3, out=input_b)
    100000 loops, best of 3: 2.53 µs per loop
    

    【讨论】:

      【解决方案2】:

      最好的办法是使用logical indexing.

      import numpy as np
      input_a = 3
      input_b = np.array([1,2,3,4,5])
      
      input_b[input_b > input_a] = input_a
      
      print(input_b)
      # [1 2 3 3 3]
      

      input_b > input_a 将返回一个包含 True 或 False 值的掩码数组,在这种情况下,如果 input_b 中的相应元素大于 input_a,则该元素将为 True。然后,您可以使用它来索引 input_b 并仅修改这些值。

      请注意,对于这个特定数组,使用逻辑索引比使用 numpy.where 更快,但我无法告诉你具体原因。

      setup = 'from __main__ import np, input_a, input_b'
      print(timeit.timeit('input_b[input_b > input_a] = input_a', setup=setup)) 
      # 2.2448947575996456
      print(timeit.timeit('np.where(input_b < input_a, input_b, input_a)', setup=setup)) 
      # 5.35540746395358
      

      【讨论】:

        【解决方案3】:

        为此,一种方法是使用numpy.where

        >>> np.where(input_b < input_a, input_b, input_a)
        array([ 1.,  2.,  3.,  3.,  3.])
        

        这里我们传递numpy.where 三个参数,其中第一个是input_b &lt; input_a 的布尔数组。只要第一个参数中的值为True,我们就从第二个参数(input_b)中获取相应索引处的值。否则我们取input_a的值。

        编辑:事实上,正如@Kasra 的回答所示,您可以直接传递input_a 而无需将其转换为np.array

        【讨论】:

          【解决方案4】:

          你可以使用numpy.where

          >>> np.where(input_b < input_a, input_b, input_a)
          array([1, 2, 3, 3, 3])
          

          【讨论】:

            【解决方案5】:

            有一个内置函数可以做到这一点:clip

            output = input_b.clip(max=input_a)
            

            或者如果你想自己设置input_b

            np.clip(input_b, None, out=input_b)
            

            这里它的作用与minimum 相同,但它也可以在同一个调用中执行maximum。有些版本接受 max 关键字,有些则不接受。

            clip 在我的时间里比minimum 有一点优势。但我会推荐哪一个的意图似乎最清晰。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-04-25
              • 2014-10-23
              • 2022-09-24
              • 2014-06-28
              • 2017-01-13
              • 2021-05-15
              • 2023-01-25
              • 1970-01-01
              相关资源
              最近更新 更多