set very low values to zero in numpy

前端 未结 6 539
傲寒
傲寒 2020-12-06 04:16

In numpy I have an array like

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

what is the fastest and easiest way to se

相关标签:
6条回答
  • 2020-12-06 04:18

    To set elements that are less than eps to zero:

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

    There could be a specialized function that is more efficient.

    If you want to suppress printing of small floats instead:

    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 讨论(0)
  • 2020-12-06 04:20

    If all numbers have small imaginary parts, and you only want to suppress these then you can use

    b=np.real_if_close(a)
    

    Otherwise the suggestion by DSM is the way forward, i.e.

    a.real[abs(a.real)<1e-13]=0
    a.imag[abs(a.imag)<1e-13]=0
    
    0 讨论(0)
  • Hmmm. I'm not super-happy with it, but this seems to work:

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

    and you can choose your tolerance as your problem requires. I usually use an order of magnitude or so higher than

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

    but it's problem-dependent.

    0 讨论(0)
  • 2020-12-06 04:34

    You can also use the numpy.isclose method:

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

    By asking if it is close to zero, it should work:

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

    You can customise the atol (absolute tolerance, defaults to 1e-08) and the rtol (relative tolerance, defaults to 1e-05) parameters. You can then set rtol=0 to only use the absolute tolerance.

    0 讨论(0)
  • 2020-12-06 04:38

    By using the method round(n) of the array

    np.array( [0 +  0.5j, 0.25 + 1.2352444e-24j, 
               0.25+ 0j, 2.46519033e-32 + 0j]  ).round(23)
    
    0 讨论(0)
  • 2020-12-06 04:45
    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])
    
    0 讨论(0)
提交回复
热议问题