Jayanth Reddy
Jayanth Reddy

Reputation: 357

Comparing multiple numpy arrays

how should i compare more than 2 numpy arrays?

import numpy 
a = numpy.zeros((512,512,3),dtype=numpy.uint8)
b = numpy.zeros((512,512,3),dtype=numpy.uint8)
c = numpy.zeros((512,512,3),dtype=numpy.uint8)
if (a==b==c).all():
     pass

this give a valueError, and i am not interested in comparing arrays two at a time.

Upvotes: 15

Views: 14018

Answers (6)

itamar kanter
itamar kanter

Reputation: 1360

one-liner solution:

arrays = [a, b, c]    
all([np.array_equal(a, b) for a, b in zip(arrays, arrays[1:])])

We test the equality of consecutive pairs of arrays

Upvotes: 1

Seong-hun Kim
Seong-hun Kim

Reputation: 1

This might work.

import numpy

x = np.random.rand(10)
arrays = [x for _ in range(10)]

print(np.allclose(arrays[:-1], arrays[1:]))  # True

arrays.append(np.random.rand(10))

print(np.allclose(arrays[:-1], arrays[1:]))  # False

Upvotes: 0

Markus Dutschke
Markus Dutschke

Reputation: 10636

solution supporting different shapes and nans

compare against first element of array-list:

import numpy as np

a = np.arange(3)
b = np.arange(3)
c = np.arange(3)
d = np.arange(4)

lst_eq = [a, b, c]
lst_neq = [a, b, d]

def all_equal(lst):
    for arr in lst[1:]:
        if not np.array_equal(lst[0], arr, equal_nan=True):
            return False
    return True

print('all_equal(lst_eq)=', all_equal(lst_eq))
print('all_equal(lst_neq)=', all_equal(lst_neq))

output

all_equal(lst_eq)= True
all_equal(lst_neq)= False

for equal shape and without nan-support

Combine everything into one array, calculate the absolute diff along the new axis and check if the maximum element along the new dimension is equal 0 or lower than some threshold. This should be quite fast.

import numpy as np

a = np.arange(3)
b = np.arange(3)
c = np.arange(3)
d = np.array([0, 1, 3])

lst_eq = [a, b, c]
lst_neq = [a, b, d]

def all_equal(lst, threshold = 0):
    arr = np.stack(lst, axis=0)

    return np.max(np.abs(np.diff(arr, axis=0))) <= threshold

print('all_equal(lst_eq)=', all_equal(lst_eq))
print('all_equal(lst_neq)=', all_equal(lst_neq))

output

all_equal(lst_eq)= True
all_equal(lst_neq)= False

Upvotes: 1

Elsewhere
Elsewhere

Reputation: 171

To expand on previous answers, I would use combinations from itertools to construct all pairs, then run your comparison on each pair. For example, if I have three arrays and want to confirm that they're all equal, I'd use:

from itertools import combinations

for pair in combinations([a, b, c], 2):
    assert np.array_equal(pair[0], pair[1])

Upvotes: 7

user2357112
user2357112

Reputation: 282042

For three arrays, you should really just compare them two at a time:

if np.array_equal(a, b) and np.array_equal(b, c):
    do_whatever()

For a variable number of arrays, let's suppose they're all combined into one big array arrays. Then you could do

if np.all(arrays[:-1] == arrays[1:]):
    do_whatever()

Upvotes: 8

Divakar
Divakar

Reputation: 221754

For three arrays, you can check for equality among the corresponding elements between the first and second arrays and then second and third arrays to give us two boolean scalars and finally see if both of these scalars are True for final scalar output, like so -

np.logical_and( (a==b).all(), (b==c).all() )

For more number of arrays, you could stack them, get the differentiation along the axis of stacking and check if all of those differentiations are equal to zeros. If they are, we have equality among all input arrays, otherwise not. The implementation would look like so -

L = [a,b,c]    # List of input arrays
out = (np.diff(np.vstack(L).reshape(len(L),-1),axis=0)==0).all()

Upvotes: 12

Related Questions