maker
maker

Reputation: 1629

Best way to assert for numpy.array equality?

I want to make some unit-tests for my app, and I need to compare two arrays. Since array.__eq__ returns a new array (so TestCase.assertEqual fails), what is the best way to assert for equality?

Currently I'm using

self.assertTrue((arr1 == arr2).all())

but I don't really like it

Upvotes: 160

Views: 110793

Answers (9)

fi0rini
fi0rini

Reputation: 1198

Using built-in unittest module works okay for nested array (deep equality) using Python 3.10.12

self.assertEqual([
    ["1","0","1","1","0","1","1"]
], [
    ["1","0","1","1","0","1","x"]
])

and it prints a nice output message for failure.

First differing element 0:
['1', '0', '1', '1', '0', '1', '1']
['1', '0', '1', '1', '0', '1', 'x']

- [['1', '0', '1', '1', '0', '1', '1']]
?                                  ^

+ [['1', '0', '1', '1', '0', '1', 'x']]
?   

A note based on your question: if you're always comparing a pointer to the same array (or modifying the array in place then comparing it to itself) the result will yield true every time... so that will be a mistake.

Upvotes: 0

Marseille
Marseille

Reputation: 140

self.assertTrue(np.array_equal(x, y, equal_nan=True))

equal_nan = True if you want to np.nan == np.nan returns True

or you can use numpy.allclose to compare with torelance.

Upvotes: 8

a_b
a_b

Reputation: 1918

Use numpy

numpy.array_equal(a, b)

Upvotes: 3

Edo user1419293
Edo user1419293

Reputation: 181

In my tests I use this:

numpy.testing.assert_array_equal(arr1, arr2)

Upvotes: 8

Josef
Josef

Reputation: 22897

check out the assert functions in numpy.testing, e.g.

assert_array_equal

for floating point arrays equality test might fail and assert_almost_equal is more reliable.

update

A few versions ago numpy obtained assert_allclose which is now my favorite since it allows us to specify both absolute and relative error and doesn't require decimal rounding as the closeness criterion.

Upvotes: 172

schiebermc
schiebermc

Reputation: 31

np.linalg.norm(arr1 - arr2) < 1e-6

Upvotes: 2

HagaiH
HagaiH

Reputation: 413

Since Python 3.2 you can use assertSequenceEqual(array1.tolist(), array2.tolist()).

This has the added value of showing you the exact items in which the arrays differ.

Upvotes: 8

asimoneau
asimoneau

Reputation: 692

I find that using self.assertEqual(arr1.tolist(), arr2.tolist()) is the easiest way of comparing arrays with unittest.

I agree it's not the prettiest solution and it's probably not the fastest but it's probably more uniform with the rest of your test cases, you get all the unittest error description and it's really simple to implement.

Upvotes: 25

SiggyF
SiggyF

Reputation: 23135

I think (arr1 == arr2).all() looks pretty nice. But you could use:

numpy.allclose(arr1, arr2)

but it's not quite the same.

An alternative, almost the same as your example is:

numpy.alltrue(arr1 == arr2)

Note that scipy.array is actually a reference numpy.array. That makes it easier to find the documentation.

Upvotes: 35

Related Questions