为什么这个 numpy 数组比较会失败?

Why does this numpy array comparison fail?

我尝试将某些 numpy.array 计算的结果与预期结果进行比较,但我经常得到错误的比较,但打印的数组看起来是一样的,例如:

def test_gen_sine():
  A, f, phi, fs, t = 1.0, 10.0, 1.0, 50.0, 0.1
  expected = array([0.54030231, -0.63332387, -0.93171798, 0.05749049, 0.96724906])
  result = gen_sine(A, f, phi, fs, t)
  npt.assert_array_equal(expected, result)

回印:

>                   raise AssertionError(msg)
E                   AssertionError: 
E                   Arrays are not equal
E                   
E                   (mismatch 100.0%)
E                    x: array([ 0.540302, -0.633324, -0.931718,  0.05749 ,  0.967249])
E                    y: array([ 0.540302, -0.633324, -0.931718,  0.05749 ,  0.967249])

我的gen_sine函数是:

def gen_sine(A, f, phi, fs, t):  
  sampling_period = 1 / fs
  num_samples = fs * t
  samples_range = (np.arange(0, num_samples) * 2 * f * np.pi * sampling_period) + phi
  return A * np.cos(samples_range)

这是为什么?我应该如何比较这两个数组? (我使用的是 numpy 1.9.3 和 pytest 2.8.1)

问题是 np.assert_array_equal returns None 并在内部执行断言语句。像你这样用一个单独的断言作为开头是不正确的:

assert np.assert_array_equal(x,y)

相反,在您的测试中,您只需执行以下操作:

import numpy as np
from numpy.testing import assert_array_equal

def test_equal():
    assert_array_equal(np.arange(0,3), np.array([0,1,2]) # No assertion raised
    assert_array_equal(np.arange(0,3), np.array([2,0,1]) # Raises AssertionError

更新:

一些评论

  • 不要重写您的整个原始问题,因为那样的话不清楚答案实际上是在解决什么问题。

  • 就您更新的问题而言,问题是 assert_array_equal 不适用于比较浮点数组,如文档中所述。而是使用 assert_allclose,然后设置所需的相对和绝对公差。