Home > front end >  Unable to understand working of np.isclose()
Unable to understand working of np.isclose()

Time:02-26

For the following input:

import numpy as np

a= np.array([[0.0, 0.0, 0.0],
            [1.0, 1.0, -2.234],
            [0.0, 0.0, 0.0]])

b= np.array([1.0, 1.0, -2.234])
print(np.isclose(np.transpose(a), b))

Output:

$ python temp.py 
--> [[False  True False]
    [False  True False]
    [False False False]]

And for following input:

print(np.isclose(a, b))

Output:

$ python temp.py 
--> [[False False False]
    [ True  True  True]
    [False False False]]

I am unable to understand why np.isclose() is unable to match column element-wise but is able to do it correctly for rows. I think there is something wrong with my understanding.

My intention is to find index of matching column. To achieve this I would be further using .all(axis=) with np.where(). But before this I want to understand the behaviour of np.isclose().

CodePudding user response:

Consider your transposed array a and b:

[[ 0.     1.     0.   ]
 [ 0.     1.     0.   ]
 [ 0.    -2.234  0.   ]]

[ 1.     1.    -2.234]

What np.isclose is doing is literally comparing (within a given tolerance) each element in each row of a with each element in b, which results in the output:

[[False  True False]
 [False  True False]
 [False False False]]

If you want to compare the arrays "column-wise", you should explicitly add an additional dimension to b. Arrays a and b would then look like this:

[[ 0.     1.     0.   ]
 [ 0.     1.     0.   ]
 [ 0.    -2.234  0.   ]]

[[ 1.   ]
 [ 1.   ]
 [-2.234]]

Then you can see if they are equal:

import numpy as np

a= np.array([[0.0, 0.0, 0.0],
            [1.0, 1.0, -2.234],
            [0.0, 0.0, 0.0]])

b = np.array([1.0, 1.0, -2.234])
a = np.transpose(a)
b = np.expand_dims(b , axis=-1)
print(np.isclose(a, b))
[[False  True False]
 [False  True False]
 [False  True False]]

CodePudding user response:

a= np.array([[0.0, 0.0, 0.0],
            [1.0, 1.0, -2.234],
            [0.0, 0.0, 0.0]])

b= np.array([1.0, 1.0, -2.234])
print(np.isclose(np.transpose(a), b))

This resolves to

np.isclose([[0.0, 1.0, 0.0],
            [0.0, 1.0, 0.0],
            [0.0, -2.234, 0.0]],

           [[1.0, 1.0, -2.234],
            [1.0, 1.0, -2.234],
            [1.0, 1.0, -2.234]])

--> [[False  True False]
     [False  True False]
     [False False False]]

And np.isclose(a, b) resolves to

np.isclose([[0.0, 0.0, 0.0],
            [1.0, 1.0, -2.234],
            [0.0, 0.0, 0.0]],

           [[1.0, 1.0, -2.234],
            [1.0, 1.0, -2.234],
            [1.0, 1.0, -2.234]])

--> [[False False False]
     [ True  True  True]
     [False False False]]

You can check that b really gets broadcasted to that 2d array using np.broadcast_to(b, a.shape)

CodePudding user response:

np.isclose just checks that the values are close enough that you can consider them equal with a given threshold

By doing:

np.isclose(np.transpose(a), b)

you compare each column of a.T with each column of b. The first column [0,0,0] is not close (i.e. almost equal) to 1. For the second column [1,1,-2.234], the first 2 values are equal to 1. For the last column [0,0,0], nothing matches -2.234.

[[False  True False]
 [False  True False]
 [False False False]]
  • Related