Skip to content
Advertisement

check if two numeric values have same sign in numpy (+/-)

currently i am using numpy.logical_or with numpy.logical_and to check if elements of two arrays have same sign. Was wondering if there is already a ufunc or a more effective method that will achieve this. My current solutions is here

a = np.array([1,-2,5,7,-11,9])
b = np.array([3,-8,4,81,5,16])
out = np.logical_or(
                    np.logical_and((a < 0),(b < 0)), 
                    np.logical_and((a > 0),(b > 0))
                                             )

edit// output

out
Out[51]: array([ True,  True,  True,  True, False,  True], dtype=bool)

Advertisement

Answer

One approach with elementwise product and then check for >=0, as same signs (both positive or both negative) would result in positive product values –

((a== b) & (a==0)) | (a*b>0)

Another with explicit sign check –

np.sign(a) == np.sign(b)

Runtime test –

In [155]: a = np.random.randint(-10,10,(1000000))

In [156]: b = np.random.randint(-10,10,(1000000))

In [157]: np.allclose(np.sign(a) == np.sign(b), ((a== b) & (a==0)) | (a*b>0))
Out[157]: True

In [158]: %timeit np.sign(a) == np.sign(b)
100 loops, best of 3: 3.06 ms per loop

In [159]: %timeit ((a== b) & (a==0)) | (a*b>0)
100 loops, best of 3: 3.54 ms per loop

# @salehinejad's soln
In [160]: %timeit np.where((np.sign(a)+np.sign(b))==0)
100 loops, best of 3: 8.71 ms per loop
User contributions licensed under: CC BY-SA
6 People found this is helpful
Advertisement