【问题标题】:set very low values to zero in numpy在numpy中将非常低的值设置为零
【发布时间】:2013-01-19 21:56:22
【问题描述】:

在 numpy 中,我有一个类似

的数组
[0 +  0.5j, 0.25 + 1.2352444e-24j, 0.25+ 0j, 2.46519033e-32 + 0j] 

将超低值设置为零的最快最简单的方法是什么

[0 +  0.5j, 0.25 + 0j, 0.25+ 0j, 0 + 0j] 

效率不是最重要的。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您也可以使用numpy.isclose method:

    >>> np.isclose([1e10,1e-7], [1.00001e10,1e-8])
    array([True, False])
    

    通过询问它是否接近于零,它应该可以工作:

    >>> np.isclose([1e10,0], [1.00001e-10,0])
    array([False, True])
    

    您可以自定义atol(绝对容差,默认为1e-08)和rtol(相对容差,默认为1e-05)参数。然后您可以将rtol=0 设置为仅使用绝对容差。

    【讨论】:

      【解决方案2】:

      将小于eps 的元素设置为零:

      a[np.abs(a) < eps] = 0
      

      可能有一个更高效的专用函数。

      如果您想禁止打印小浮点数:

      import numpy as np
      a = np.array([1+1e-10j])
      print a # -> [ 1. +1.00000000e-10j]
      
      np.set_printoptions(suppress=True)
      print a # -> [ 1.+0.j]
      

      【讨论】:

      • 不过,0.25 +1.23524440e-24j 就不用管了。
      • @DSM:我添加了抑制打印时小浮动的变体(对 OP 意图的另一种可能解释)
      【解决方案3】:

      嗯。我对此并不满意,但这似乎可行:

      >>> a = np.array([0 +  0.5j, 0.25 + 1.2352444e-24j, 0.25+ 0j, 2.46519033e-32 + 0j])
      >>> a
      array([  0.00000000e+00 +5.00000000e-01j,
               2.50000000e-01 +1.23524440e-24j,
               2.50000000e-01 +0.00000000e+00j,   2.46519033e-32 +0.00000000e+00j])
      >>> tol = 1e-16
      >>> a.real[abs(a.real) < tol] = 0.0
      >>> a.imag[abs(a.imag) < tol] = 0.0
      >>> a
      array([ 0.00+0.5j,  0.25+0.j ,  0.25+0.j ,  0.00+0.j ])
      

      您可以根据问题的需要选择容差。我通常使用一个数量级或更高的数量级

      >>> np.finfo(np.float).eps
      2.2204460492503131e-16
      

      但这取决于问题。

      【讨论】:

      • 我选择了这个,因为它可以处理实数和复数,而且非常简单直观。
      【解决方案4】:

      通过使用数组的round(n)方法

      np.array( [0 +  0.5j, 0.25 + 1.2352444e-24j, 
                 0.25+ 0j, 2.46519033e-32 + 0j]  ).round(23)
      

      【讨论】:

      【解决方案5】:

      如果所有数字都有小的虚部,而你只想抑制这些,那么你可以使用

      b=np.real_if_close(a)
      

      否则帝斯曼的建议是前进的方向,即

      a.real[abs(a.real)<1e-13]=0
      a.imag[abs(a.imag)<1e-13]=0
      

      【讨论】:

        【解决方案6】:
        diff = x-y
        diff[diff>1.e-16]
        
        Out[93]:
        array([], dtype=float64)
        
        diff[diff>1.e-18]
        
        array([1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
               1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
               1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
               1.73472348e-18, 1.73472348e-18, 1.73472348e-18, 1.73472348e-18,
               1.73472348e-18])
        

        【讨论】:

        • 欢迎来到 StackOverflow!目前尚不清楚这如何回答这个问题。请添加您在此处提供的代码的一些解释以及它如何回答问题。还要格式化要呈现的代码(使用编辑窗口中的按钮栏)。
        猜你喜欢
        • 2019-09-08
        • 2020-06-20
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多