繁体   English   中英

空记录数组的Unittest相等

[英]Unittest equality of empty record arrays

我注意到以下unittest.TestCase断言失败,我想知道如何正确比较空重组:

失败:

self.assertEqual(
    np.array(
        [],
        dtype=[
            ('time', 'datetime64[ns]'),
            ('end_time', int)
        ]
    ).view(np.recarray),
    np.array(
        [],
        dtype=[
            ('time', 'datetime64[ns]'),
            ('end_time', int)
        ]
    ).view(np.recarray)
)

经过:

self.assertEqual(
    np.array(
        [(1,1)],
        dtype=[
            ('time', 'datetime64[ns]'),
            ('end_time', int)
        ]
    ).view(np.recarray),
    np.array(
        [(1,1)],
        dtype=[
            ('time', 'datetime64[ns]'),
            ('end_time', int)
        ]
    ).view(np.recarray)
)

这是一个错误还是我在这里做错了什么?

我只能假设unittest.TestCase.assertEqual使用__eq__方法,它在numpy.ndarray对象中实现了元素相等。 因此,在两个空数组上使用==返回一个空的布尔数组,这是一个假的

>>> arr1
rec.array([],
          dtype=[('time', '<M8[ns]'), ('end_time', '<i8')])
>>> arr2
rec.array([],
          dtype=[('time', '<M8[ns]'), ('end_time', '<i8')])
>>> bool(arr1 == arr2)
False

现在,在第二种情况下,您正在处理另一个特殊情况,即形状数组(1,) ,这是两个具有单个元素的记录数组上元素相等的结果。 基本上,在具有单个项的数组的情况下,真实性是元素的真实性:

>>> bool(np.array([1]))
True
>>> bool(np.array([0]))
False
>>> bool(np.array([{}]))
False
>>> bool(np.array([{'a':1}]))
True
>>> bool(np.array([object()]))
True

所以,使用你的数组:

>>> arr3 = np.array(
...         [(1,1)],
...         dtype=[
...             ('time', 'datetime64[ns]'),
...             ('end_time', int)
...         ]
...     ).view(np.recarray)
>>> arr4 = np.array(
...         [(1,1)],
...         dtype=[
...             ('time', 'datetime64[ns]'),
...             ('end_time', int)
...         ]
...     ).view(np.recarray)
>>> arr3.size, arr4.size
(1, 1)
>>> arr3 == arr4
rec.array([ True],
          dtype=bool)
>>> bool(arr3 == arr4)
True

请注意,在结果数组的.size大于1的任何情况下,如果您尝试评估真值,则会出现此臭名昭着的错误,因此:

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

@ juanpa.arrivillaga是对的。 但另外您应该注意,最好使用numpy.testing模块对NumPy阵列进行测试。 例如:

np.testing.assert_equal(
    np.array(
        [],
        dtype=[
            ('time', 'datetime64[ns]'),
            ('end_time', int)
        ]
    ).view(np.recarray),
    np.array(
        [],
        dtype=[
            ('time', 'datetime64[ns]'),
            ('end_time', int)
        ]
    ).view(np.recarray)
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM