2015-10-10 2 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 внутренне. Неправильно предварить его отдельным утверждают, как и вы:

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 

Update:

Несколько замечаний

  • Не переписывайте весь исходный квест ион, потому что тогда было непонятно, на что фактически обратился ответ.

  • Что касается вашего обновленного вопроса, то проблема заключается в том, что assert_array_equal не подходит для сравнения массивов с плавающей точкой, как описано в документации. Вместо этого используйте assert_allclose, а затем установите желаемые относительные и абсолютные допуски.

+0

Спасибо. Я исправил это, и этот простой случай работает, но более сложные, например, все еще не работают. Я отредактирую свой вопрос соответствующим образом. – Luftzig

+0

@Luftzig См. Мой обновленный ответ. – JoshAdel

+0

TIL: 'assert_array_equal'; благодаря! – user4815162342

Смежные вопросы