Home > Back-end >  Comparing three numpy arrays so wherever one is not a given value, the other are not that given valu
Comparing three numpy arrays so wherever one is not a given value, the other are not that given valu

Time:12-17

Is there an effective way in which to compare all three numpy arrays at once?

For example, if the given value to check is 5, wherever the value is not 5, it should be not 5 for all three arrays.

The only way I've thought of how to do this would be checking that occurrences that arr1 != 5 & arr2 == 5 is 0. However this only checks one direction between the two arrays, and then I need to also incorporate arr3. This seems inefficient and might end up with some logical hole.

This should pass:

arr1 = numpy.array([[1, 7, 3], 
                [4, 5, 6],
                [4, 5, 2]])

arr2 = numpy.array([[1, 2, 3], 
                [4, 5, 6],
                [8, 5, 6]])

arr3 = numpy.array([[1, 1, 3], 
                [4, 5, 6],
                [9, 5, 6]])

However this should fail due to arr2 having a 3 where other arrays have 5s

arr1 = numpy.array([[1, 2, 3], 
                [8, 5, 6],
                [4, 5, 6]])

arr2 = numpy.array([[1, 2, 3], 
                [2, 3, 1],
                [2, 5, 6]])

arr3 = numpy.array([[1, 2, 3], 
                [4, 5, 6],
                [4, 5, 3]])

CodePudding user response:

Is this a valid solution?

numpy.logical_and(((arr1==5)==(arr2==5)).all(), ((arr2==5)==(arr3==5)).all())

CodePudding user response:

You could AND all comparisons to 5 and compare to any one of the comparisons:

A = (arr1==5)
(A==(A&(arr2==5)&(arr3==5))).all()

Output: True for the first example, False for the second

NB. This works for any number of arrays

CodePudding user response:

There is a general solution (regardless number of arrays). And it's quite educational:

import numpy as np #a recommended way of import
arr = np.array([arr1, arr2, arr3])
is_valid = np.all(arr==5, axis=0) == np.any(arr==5, axis=0) #introduce axis
out = np.all(is_valid)
#True for the first case, False for the second one
  • Related