Search code examples
pythonarraysscipy

Test of equality between arrays using in1d function


Before I ask my question, I provide you with the code:

from scipy import *
x = randn(10)
cum_x = cumsum(x)
# The objective is to recover x using cum_x and the diff function.
y = append(cum_x[0], diff(cum_x))
# Now, y should be equal to x but this is not confirmed by the function in1d
test = in1d(x,y)

The variable test does not return an array of "True" boolean values even if y and x are clearly the same. What is the problem here?


Solution

  • if you use set_printoptions to increase precision you will see some differences:

    import numpy as np
    from scipy import *
    np.set_printoptions(30)
    x = randn(10)
    cum_x = cumsum(x)
    
    #The objective is to recover x using cum_x and the diff function.
    y = append(cum_x[0], diff(cum_x))
    print(x)
    print("\n")
    print(y)
    #Now, y should be equal to x but this is not confirmed by the function in1d
    test = in1d(x, y)
    print(test)
    

    Output:

    [ 0.54816314147543721002620031868   0.14319052613251953554041051575
      0.489110961092741158839913850898 -0.093011827554544138085823590245
     -0.58370623188476589149331630324  -0.40395493550429123486011917521
      0.387387395892057895263604905267  1.001637373359834937147638811439
     -1.486778459872974744726548124163  1.446772274227251076084144187917]
    
    
    [ 0.54816314147543721002620031868   0.143190526132519591051561747008
      0.48911096109274110332876261964  -0.093011827554544179719187013688
     -0.58370623188476589149331630324  -0.40395493550429123486011917521
      0.387387395892057895263604905267  1.001637373359834937147638811439
     -1.486778459872974744726548124163  1.446772274227251076084144187917]
    [ True False False False  True  True  True  True  True  True]
    

    What you probably want is allclose but interestingly setting the dtype to np.float128 or np.longdouble on my ubuntu system does not lose precision and in1d returns True.

     cum_x = cumsum(x,dtype=np.longdouble)