【问题标题】:ValueError for numpy array with unittest Python带有unittest Python的numpy数组的ValueError
【发布时间】:2019-12-11 14:58:30
【问题描述】:

我有以下问题。

我有这些功能:

def string_to_2Darray(flat_string):

    """converts a string of type '0,1,0,1,1,1,0,1,0'"""

    array1d = np.fromstring(flat_string, dtype=int, sep=',')
    return np.reshape(array1d, (-1,3)) 

我为此函数编写了一个单元测试类,如下所示:

class StringTo2DArray(unittest.TestCase):

    def test_string_2DArray(self):
        string_example_0 = '0,1,0,1,1,1,0,1,0'
        array_example_0 = string_to_2Darray(string_example_0)
        print(array_example_0)
        print(type(array_example_0))
        self.assertEqual([[0,1,0],[1,1,1],[0,1,0]], array_example_0)

看到我在 unittest 的 StringTo2DArray 类的 test_string_2Darray 模块的主体中​​添加了一些打印语句。

当我运行 python -m unittest 时,我收到以下错误消息:

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

我不知道为什么会发生这种情况,因为字符串已正确转换为 2D numpy 数组,并且与我在断言中传递的数组 [[0,1,0],[1,1,1],[0,1,0]] 不匹配。等于我的测试。

【问题讨论】:

标签: python arrays numpy unit-testing


【解决方案1】:

您可以使用 numpy.testing 套件中的函数检查两个 numpy 数组是否相等。

在你的情况下,你可以替换

self.assertEqual([[0,1,0],[1,1,1],[0,1,0]], array_example_0)

numpy.testing.assert_array_equal([[0,1,0],[1,1,1],[0,1,0]], array_example_0)

【讨论】:

    【解决方案2】:

    @Roger Almengor,

    正如@llllllIIIIll 回答的那样,这是 Python 的 TestCase 实现中的一个已知错误。 assertEqual(a, b) 实现假定 a==b 操作将返回一个 True 或一个 False,但如果它返回一个包含多个布尔值的复合值,则会引发此错误。例如,如果 a、b 是 numpy 的数据数组或 Tensorflow 的张量,就会触发这个 bug。

    有两种解决方案可以解决此错误:

    1. 将 numpy 数据数组或张量转换为列表,因为 a_list==b_list 将返回一个布尔值,因此 TestCase assertEqual() 可以正确处理它。
    2. 使用 numpy 或 tesorflow 的自定义版本 TestCase 实现,它们有自己的版本,用于 numpy 数组和张量的 assertEqual() 函数实现,例如 assert_array_equal()# 在 numpy 中, 或 assertAllEqual() ## in Tensorflow.test.TestCase

    【讨论】:

    猜你喜欢
    • 2020-08-09
    • 2021-06-18
    • 2014-05-21
    • 2023-03-05
    • 2018-07-05
    • 1970-01-01
    • 2015-10-16
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多