【问题标题】:How to compare equality of two tuples that involve with list如何比较涉及列表的两个元组的相等性
【发布时间】:2019-12-07 01:06:54
【问题描述】:

找到了thisthis,但没有解决我的问题。

我想通过比较两个元组作为一个整体来执行单元测试,而不是逐个元素。 元组涉及 int 和布尔值列表。列表的长度因我的实际情况而异。为简单起见,出于演示目的,我将列表的长度固定为 2。 所以我要单元测试的函数给出的输出格式如下:

A = some_function(input)
where 
$ some_function(input)
> (array([ True, True]), array([ True, False]), 2)

我尝试通过创建 B 来对 A 进行单元测试,如下所示:

B = (np.array([True, True]), np.array([True, False]), 2)

我尝试了以下方法,但都返回 False 而不是 True,正如我所期望的那样。为什么?我该如何解决?

np.array_equal(A,B) 
> False 
np.array_equiv(A,B)
> False 
A==B

>ValueError                                Traceback (most recent call last)
<ipython-input-125-2c88eac8e390> in <module>
      1 A=_tokenwise_to_entitywise(ref,hyp)
----> 2 B== (np.array([True,True]), np.array([True,False]), 2)
      3 
      4 A==B

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

【问题讨论】:

  • A == B 到底有什么问题?
  • 顺便说一下,这些是元组,而不是数组
  • 我无法复制 np.array_equal(A,B)np_array_equiv(A,B) 返回 False。我得到了True

标签: python numpy unit-testing


【解决方案1】:
>>> a
(array([ True,  True]), array([ True, False]), 2)
>>> b
(array([ True,  True]), array([ True, False]), 2)
>>> a==b
Traceback (most recent call last):
  File "<pyshell#75>", line 1, in <module>
    a==b
ValueError: The truth value of an array with more than one element is ambiguous. Use  a.any() or a.all()

相等性测试按元素进行比较。 ndarray 比较返回一个 ndarray。

>>> a[0]==b[0]
array([ True,  True])
>>> 

正如错误消息所述,这可能是模棱两可的。如果你在 SO 中搜索The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(),你会发现很多问答

>>> bool(a[0]==b[0])
Traceback (most recent call last):
  File "<pyshell#78>", line 1, in <module>
    bool(a[0]==b[0])
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> 

您的第一个链接几乎可以到达那里,您只需将np.all 应用于每个元素的比较。

>>> all(np.all(x==y) for x,y in zip(a,b))
True
>>> #or
>>> any(map(np.all,zip(a,b)))
True
>>>

我得想一想,看看有没有更好的办法。

【讨论】:

    【解决方案2】:

    我还不能发表评论,但是上面的答案应该有效。

    或者您可以创建一个可重用的函数。

    def equality_check(A, B):
        X = True
        if A==B:
            X = True
        else:
            X = False
        return X
    

    然后就可以运行了

    print(equality_check(A, B))
    

    在任何变量、列表、数组、元组等上

    或者你可以创建布尔对象

    x = equality_check(A, B)
    print(x)
    

    这使您可以存储该布尔值以供以后使用。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-03-10
      • 2012-05-21
      • 2016-11-22
      • 2017-05-11
      • 2019-04-06
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多