Python 为什么(3.3==np.asarray([3.3])等于[True]而不是False?
下面的语句通过了我的测试Python 为什么(3.3==np.asarray([3.3])等于[True]而不是False?,python,unit-testing,numpy,testing,Python,Unit Testing,Numpy,Testing,下面的语句通过了我的测试 self.assertEqual(3.3, np.asarray([3.3])) 一种是numpy.float64另一种是numpy.ndarray,我的假设是该测试将失败,但它通过了 下面的语句打印[True] print(3.3 == np.asarray([3.3])) 调试进一步显示,assertEquals最终调用unittest.case.TestCase\u baseAssertEqual,它使用=检查相等性: if not first == seco
self.assertEqual(3.3, np.asarray([3.3]))
一种是numpy.float64
另一种是numpy.ndarray
,我的假设是该测试将失败,但它通过了
下面的语句打印[True]
print(3.3 == np.asarray([3.3]))
调试进一步显示,assertEquals
最终调用unittest.case.TestCase\u baseAssertEqual
,它使用=
检查相等性:
if not first == second:
standardMsg = '%s != %s' % _common_shorten_repr(first, second)
msg = self._formatMessage(msg, standardMsg)
raise self.failureException(msg)
有人能解释一下testself.assertEqual(3.3,np.asarray([3.3])
通过的原因和方式吗
编辑:如果将一个值的数组与一个变量进行比较,那么
==
是如何工作的?这种行为记录在哪里?在Python
中,可以在特定类型上添加几个\ueq\uuu
方法,使其与另一个方法相比较。可能是通过numpy.ndarray
实现的
在这种情况下,当选中a==b
时,它将转换为a.\uuuu eq\uuuu(b)
。如果a
的类型已经为b
的类型实现了\uuuuueq\uuuuu
方法比较,则可以将它们与=
进行比较
资料来源:如中所述:
Ndarray上的算术和比较运算定义为
元素操作,并通常生成ndarray对象作为
结果
对ndarray的=
操作返回另一个ndarray,而不是单个布尔值True
或False
这对于数据处理很有用,但它与几乎所有其他python对象都不同,即
A==B
将返回一个简单的布尔值。但是您还没有确定此assertEqual
传递的原因吗?正如您所说,3.3==np.asarray([3.3])
的计算结果为[True]
。因此,行为似乎是:如果a==b
给出一个值,那么assertEqual(a,b)
将通过。正如@Kevin所指出的,您似乎已经自己回答了这个问题。如果您愿意,您可以额外地通过测试,如果有mismatch@Kevin但这并不能解释为什么一个值为3.3的float64对象等于一个将值为3.3的float64作为唯一元素的ndarray,是吗?也许“为什么3.3==np.asarray([3.3])
的计算结果不是False?”这是一个有趣而有价值的问题,在这种情况下,我觉得应该独立于围绕这个问题的提问assertEquals@M-瓦吉:因为numpy阵列使用广播。比较不应用于整个数组,而是获得一个新数组,其中比较结果应用于数组中的每个值。然后,您可以使用给出的布尔数组来执行进一步的操作。对几种\uuuuu eq\uuuu
方法感到困惑,您能提供一个示例吗?