numpy 的 assert_array_equal 是不是验证复杂的 NaN 完全相等?

Posted

技术标签:

【中文标题】numpy 的 assert_array_equal 是不是验证复杂的 NaN 完全相等?【英文标题】:Does numpy's assert_array_equal verify that complex NaNs are exactly equal?numpy 的 assert_array_equal 是否验证复杂的 NaN 完全相等? 【发布时间】:2020-05-05 14:50:47 【问题描述】:

我想要两个包含NaN 的复数的numpy数组是否完全相等。

具体来说,我想验证对于NaN,不仅两个数组中都有NaN,而且NaN 的实部和虚部在值上匹配。

有人知道assert_array_equal 是这样做还是我必须自己检查一下?

【问题讨论】:

如果你提供一个例子会有所帮助。 这似乎很容易在提示下进行测试。对我来说,np.testing.assert_array_equal(np.array([complex(2.3, np.nan)]), np.array([complex(np.nan, 2.3)])) 不会提高。 @MarkDickinson 当然!我自己应该想到的……非常感谢。 【参考方案1】:

Numpy 只是检查是否有 NaN 值 in the same positions 并为此目的使用 np.isnan。这里实部或虚部是否包含 NaN 值并不重要:

>>> np.isnan(np.sqrt(-1.) + 1j)
True
>>> np.isnan(np.sqrt(-1.) * 1j)
True

同样适用于两个数组ab

>>> a = np.zeros(3, dtype=np.complex128)
>>> b = a.copy()
>>> a[0] = np.sqrt(-1.) + 1j
>>> b[0] = np.sqrt(-1.) * 1j
>>> a
array([nan+1.j,  0.+0.j,  0.+0.j])
>>> b
array([nan+nanj,  0. +0.j,  0. +0.j])
>>> np.testing.assert_array_equal(a, b) is None
True

【讨论】:

【参考方案2】:

来自comparing numpy arrays containing NaN

def eq(a, b):
    return np.all((a == b) | (np.isnan(a) & np.isnan(b)))

要比较复数,只需检查实部和虚部是否相等。例如:

a = np.array([1+2j, 3+4j, np.nan+6j])
b = np.array([1+2j, 3+4j, np.nan+5j])

eq(a.real, b.real) & eq(a.imag, b.imag)
False

编辑:或者你可以使用np.allclose(a.real, b.real, equal_nan=True) & np.allclose(a.imag, b.imag, equal_nan=True)

【讨论】:

以上是关于numpy 的 assert_array_equal 是不是验证复杂的 NaN 完全相等?的主要内容,如果未能解决你的问题,请参考以下文章

numpy使用np.printoptions函数抑制numpy对于长numpy数组的自动省略显示numpy数组中的所有数据

numpy模块

numpy 使用

NumPy学习——numpy初级

numpy.where和numpy.piecewise的用法

numpy-1