【问题标题】:Filter integers in numpy float array过滤numpy浮点数组中的整数
【发布时间】:2018-08-30 10:14:49
【问题描述】:

是否有任何内置函数可以丢弃整数并在numpy 中仅保留浮点数。

import numpy as np

input = np.array([0.0, 0.01, 1.0, 2.0, 2.001, 2.002])

desired_ouput = some_function(input)
# Expected ouput
# desired_output = np.array([0.01, 2.001, 2.002])

【问题讨论】:

  • 该数组中的所有值都是浮点数。 “float”并不意味着该值是非整数。

标签: python numpy


【解决方案1】:

掩码是否每个元素都等于它作为一个整数。

arr = np.array([0.0, 0.01, 1.0, 2.0, 2.001, 2.002])
out = arr[arr != arr.astype(int)]
#np.array([0.01, 2.001, 2.002])

【讨论】:

    【解决方案2】:

    我不这么认为。我的方法是

    import numpy as np
    a = np.array([0.0, 0.01, 1.0, 2.0, 2.001, 2.002])
    mask = np.isclose(a, a.astype(int))
    
    print(a[~mask])
    #[ 0.01   2.001  2.002]
    

    【讨论】:

    • 作为一般规则,在比较浮点数时始终使用isclose。我不确定这里是否有必要,但赞成良好的做法。
    • 盲目地遵循所谓的“好习惯”并不是一个好习惯。 isclose,取决于这些数字的来源,实际上可能是有害的。
    【解决方案3】:

    我知道没有内置函数。但是您可以自己创建一个:

    import numpy as np
    
    A = np.array([0.0, 0.01, 1.0, 2.0, 2.001, 2.002])
    
    def remove_ints(arr):
        return arr[~(arr == arr.astype(int))]
    
    res = remove_ints(A)
    
    array([ 0.01 ,  2.001,  2.002])
    

    除此之外,您不应使用诸如input 之类的内置类作为变量名。

    【讨论】:

      【解决方案4】:

      我一直使用np.equalnp.mod

      >>> A[~np.equal(np.mod(A, 1), 0)]
      array([0.01 , 2.001, 2.002])
      

      【讨论】:

        【解决方案5】:

        如果你没有太多数据(短名单),也许不需要numpy

        >>> i = [0.0, 0.01, 1.0, 2.0, 2.001, 2.002]
        >>> a=[j for j in i if not j.is_integer()]
        >>> a
        ['0.01', '2.001', '2.002']
        

        否则请参阅 Joe Iddon 的回答

        【讨论】:

        • scipy 的理念是永远不要使用for 来提高效率。
        【解决方案6】:

        我不知道任何内置函数,但您可以使用以下方法过滤这些浮点数:

        filter(lambda x: int(str(x).split('.')[1]) != 0, input)
        

        这里的 lambda 表达式检查小数位是否为零,我将其解释为整数。

        【讨论】:

        • 转换为字符串会丢失精度。例如 2.001 变为 2.0009999999999999
        • 什么?我刚刚尝试复制它,但[str(x) for x in input] 返回:['0.0', '0.01', '1.0', '2.0', '2.001', '2.002']?但即使我假设准确性下降,它也不会改变结果,因为在 int 转换后,'001' 不会显示为 0,就像 '00099999' 一样。
        • 它发生在我的 python 中。实际上这些是 pandas 数据帧的索引,所以精度损失意味着,我无法通过 apply .loc 方法取回值。
        • 嗯,如果你能找到一种复制效果的方法,这确实会非常有趣......
        【解决方案7】:

        不久前我有一个类似的问题:Numpy: Check if float array contains whole numbers。我目前知道的掩盖分数的最简单方法是

        mask = ((input % 1) != 0)
        

        然后您可以直接使用蒙版

        output = input[mask]
        

        困扰我的是没有内置函数可以快速确定浮点数的整数,所以我写了一个快速的ufunc,它为numpy提供了float.is_integer的功能。有兴趣可以从github下载编译:

        from is_integer_ufunc import is_integer
        
        output = input[~is_integer(input)]
        

        我会看看 numpy 社区是否想考虑将类似的东西添加到核心库中。这个问题似乎经常出现,足以证明它的合理性。

        【讨论】:

          猜你喜欢
          • 2015-07-07
          • 1970-01-01
          • 2019-01-31
          • 1970-01-01
          • 1970-01-01
          • 2020-02-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多