<p>我将回答隐藏在你问题标题和前半部分的半个问题,因为坦率地说,这是一个需要解决的更常见的问题,而现有的答案并没有很好地解决这个问题。这个问题是“<em>如何比较numpy数组的两个dicts以获得相等性?在</p>
<p>问题的第一部分是“从远处”检查dicts:看看它们的键是一样的。如果所有键都相同,则第二部分将比较每个对应的值。在</p>
<p>现在微妙的问题是很多numpy数组不是整数值,而且<a href="https://stackoverflow.com/questions/588004/is-floating-point-math-broken">double-precision is imprecise</a>。因此,除非您有整数值(或其他非浮点型)数组,否则您可能需要检查这些值是否几乎相同,即在机器精度范围内。所以在本例中,您不会使用<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.array_equal.html" rel="nofollow noreferrer">^{<cd1>}</a>(它检查精确的数值相等性),而是使用<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.allclose.html" rel="nofollow noreferrer">^{<cd2>}</a>(它对两个数组之间的相对和绝对误差使用有限的公差)。在</p>
<p>问题的前一个半部分很简单:检查dicts的键是否一致,并使用生成器理解来比较每个值(并在理解之外使用<code>all</code>来验证每个项是否相同):</p>
<pre><code>import numpy as np
# some dummy data
# these are equal exactly
dct1 = {'a': np.array([2, 3, 4])}
dct2 = {'a': np.array([2, 3, 4])}
# these are equal _roughly_
dct3 = {'b': np.array([42.0, 0.2])}
dct4 = {'b': np.array([42.0, 3*0.1 - 0.1])} # still 0.2, right?
def compare_exact(first, second):
"""Return whether two dicts of arrays are exactly equal"""
if first.keys() != second.keys():
return False
return all(np.array_equal(first[key], second[key]) for key in first)
def compare_approximate(first, second):
"""Return whether two dicts of arrays are roughly equal"""
if first.keys() != second.keys():
return False
return all(np.allclose(first[key], second[key]) for key in first)
# let's try them:
print(compare_exact(dct1, dct2)) # True
print(compare_exact(dct3, dct4)) # False
print(compare_approximate(dct3, dct4)) # True
</code></pre>
<p>正如您在上面的例子中所看到的,整数数组比较精确,并且根据您正在做什么(或者如果幸运的话),它甚至可以用于float。但是如果你的浮动是任何一种算术的结果(比如线性变换?)你一定要用近似的支票。有关后一个选项的完整描述,请参见<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.allclose.html" rel="nofollow noreferrer">the docs of ^{<cd4>}</a>(及其元素方面的朋友<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.isclose.html" rel="nofollow noreferrer">^{<cd5>}</a>),特别是<code>rtol</code>和{<cd7>}关键字参数。在</p>