Comparing two dictionaries with numpy matrices as values

I want to argue that the two Python dictionaries are equal (this means: an equal number of keys, and each mapping from key to value is equal, the order is not important). An easy way would be assert A==B , however this does not work if the values ​​of the dictionaries are numpy arrays . How can I write a function to check in general if two dictionaries are equal?

 >>> import numpy as np >>> A = {1: np.identity(5)} >>> B = {1: np.identity(5) + np.ones([5,5])} >>> A == B ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

EDIT I know that numpy matrices should be checked for equality with .all() . What I'm looking for is a general way to test this without checking isinstance(np.ndarray) . Is it possible?

Related topics without numpy arrays:

+5
source share
2 answers

Consider this code

 >>> import numpy as np >>> np.identity(5) array([[ 1., 0., 0., 0., 0.], [ 0., 1., 0., 0., 0.], [ 0., 0., 1., 0., 0.], [ 0., 0., 0., 1., 0.], [ 0., 0., 0., 0., 1.]]) >>> np.identity(5)+np.ones([5,5]) array([[ 2., 1., 1., 1., 1.], [ 1., 2., 1., 1., 1.], [ 1., 1., 2., 1., 1.], [ 1., 1., 1., 2., 1.], [ 1., 1., 1., 1., 2.]]) >>> np.identity(5) == np.identity(5)+np.ones([5,5]) array([[False, False, False, False, False], [False, False, False, False, False], [False, False, False, False, False], [False, False, False, False, False], [False, False, False, False, False]], dtype=bool) >>> 

Note that the result of the comparison is a matrix, not a boolean. Comparison Dict will compare values ​​using cmp methods, which means that when comparing matrix values, comparing dict will get a composite result. What you want to do is use numpy.all to collapse the result of a compound array into a scalar boolean result

 >>> np.all(np.identity(5) == np.identity(5)+np.ones([5,5])) False >>> np.all(np.identity(5) == np.identity(5)) True >>> 

You will need to write your own function to compare these dictionaries, test the types of values ​​to see if they are matrices, and then compare using numpy.all , otherwise == used. Of course, you can always get fancy and start subclassing the dict and overloading cmp if you want.

+1
source

Source: https://habr.com/ru/post/1204904/


All Articles