2015-10-10 80 views
2

我嘗試一些numpy.array計算的結果與預期結果進行比較,我不斷得到錯誤的比較,但印刷陣列看起來是一樣的,如:爲什麼這個numpy數組比較失敗?

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)

+0

用於比較浮動的基本'numpy'函數是'np.allclose'。 – hpaulj

回答

4

問題是np.assert_array_equal返回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,然後設置所需的相對和絕對容差。

+0

謝謝。我已經解決了這個問題,這個簡單的案例很有效,但更復雜的案例仍然失敗。我會相應地編輯我的問題。 – Luftzig

+0

@Luftzig查看我的更新回答。 – JoshAdel

+0

TIL:'assert_array_equal';謝謝! – user4815162342