2014-10-17 77 views
5

我想要断定两个Python字典是相等的(这意味着:等量密钥,和从关键值每个映射是相等;顺序并不重要)。一个简单的办法是assert A==B,但是,如果字典的值是numpy arrays这不起作用。如何编写一个函数来检查一般两个字典是否相等?比较两个字典与numpy的矩阵作为值

>>> 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() 

编辑我知道numpy的矩阵应检查其平等.all()。我正在寻找的是检查此的一般方法,而不必检查isinstance(np.ndarray)。这可能吗?

相关信息不numpy的数组:

+0

我认为你应该做的'A [1]。所有()== B [1]。所有()' – EdChum 2014-10-17 08:28:37

回答

1

考虑以下代码

>>> 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) 
>>> 

注意比较的结果是一个矩阵,而不是一个布尔值。字典比较将使用值CMP方法,这意味着,比较矩阵值的情况下,比较字典将得到的复合结果比较值。你想要做的是使用 numpy.all崩溃复合数组结果为标布尔结果

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

您需要编写自己的函数来比较这些字典,测试值类型,看看他们是matricies,然后使用numpy.all进行比较,否则使用==。当然,你总是可以得到看中,并开始继承字典和重载CMP,如果你想太多。

+0

我也不是很清楚关于这一点,但我希望在没有明确检查类型的情况下使用一般方法。今天这是一个数量庞大的阵列,明天它是我今天从未听说过的类型。 – physicalattraction 2014-10-17 09:50:30

+0

我不认为有一种解决办法,恐怕。如果你的(或numpy或别人的)类型重载__cmp__返回一个非标量,标准的python比较将无法处理它。 – sirlark 2014-10-17 10:20:32