Remove rows in a 2d numpy array with opposite elements

Viewed 41

I have a numpy array like:

[[  90  -51  -90]
 [  67   47  -43]
 [ -27   27  100]
 [  55   -1  -50]
 [ -95  -55   69]]

Is there a way I can, in numpy, remove rows with opposite elements, like [ 90 -51 -90] or [ -27 27 100], without using a For loop?

Thanks !

1 Answers

Here's one approach -

In [20]: a
Out[20]: 
array([[ 90, -51, -90],
       [ 67,  47, -43],
       [-27,  27, 100],
       [ 55,  -1, -50],
       [-95, -55,  69]])

In [21]: p = np.take_along_axis(a,np.abs(a).argsort(1),axis=1)

In [22]: a[~((p[:,:-1]+p[:,1:])==0).any(1)]
Out[22]: 
array([[ 67,  47, -43],
       [ 55,  -1, -50],
       [-95, -55,  69]])

One-liner with broadcasting -

In [44]: a[~(((a[:,None,:]+a[:,:,None])==0).any(2)).any(1)]
Out[44]: 
array([[ 67,  47, -43],
       [ 55,  -1, -50],
       [-95, -55,  69]])
Related