Numpy.array eşitliğini savunmanın en iyi yolu?


105

Uygulamam için bazı birim testleri yapmak istiyorum ve iki diziyi karşılaştırmam gerekiyor. Yana array.__eq__getiriler yeni dizisi (şimdiye TestCase.assertEqualbaşarısız), eşitlik için savunmak için en iyi yolu nedir?

Şu anda kullanıyorum

self.assertTrue((arr1 == arr2).all())

ama bundan gerçekten hoşlanmıyorum


1
Örneğinizin beklenmedik bir şekilde True sonucunu verebileceğine dikkat edin, örneğin (np.array([1, 1]) == np.array([1])).all()True
M. Bernhardt

1
self.assertTrue (np.array_equal (dizi1, dizi2))
Miszo97

Yanıtlar:


120

assert işlevlerini kontrol edin numpy.testing, örneğin

assert_array_equal

kayan noktalı diziler için eşitlik testi başarısız olabilir ve assert_almost_equaldaha güvenilirdir.

Güncelleme

Birkaç versiyon önce elde edilen numpy assert_allclose, hem mutlak hem de göreceli hatayı belirlememize izin verdiği ve yakınlık kriteri olarak ondalık yuvarlamayı gerektirmediği için şimdi benim favorim.


18
Bu, unittest ile nasıl etkileşim kurar? Konuyla ilgili bazı sözlerin faydalı olacağını düşünüyorum.
Ramon Martinez

Asla unittest kullanmam. Bununla birlikte, numpy, scipy ve statsmodels tarafından kullanılan nosetests ile çok iyi çalışır. Sadece bir test işlevi veya yöntemi içindeki iddiaları kullanın.
Josef

Bu, iki bağımsız değişkenin her ikisinin de uyuşmuş dizi olduğunu doğrulamaz. Örneğin, bir dizi ve bir listede başarılı olur. Test için, bunların gerçekte diziler olduğunu doğrulamak faydalı olabilir, ancak sanırım türün manuel olarak kontrol edilmesini gerektirecek?
en fazla

4
@RamonMartinez assert_allclose unittest ile güzelce oynuyor gibi görünüyor :)
kotakotakota

4
@RamonMartinez Python'u unittestkullanırsanız , diziler eşitse self.assertIsNone(np.testing.assert_array_equal(a, b))döndürdüğü gibi kullanabilirsiniz None.
mjkrause

24

Bence (arr1 == arr2).all()çok güzel görünüyor Ancak şunları kullanabilirsiniz:

numpy.allclose(arr1, arr2)

ama tamamen aynı değil.

Hemen hemen sizin örneğinizle aynı olan bir alternatif:

numpy.alltrue(arr1 == arr2)

Scipy.array öğesinin aslında bir referans numpy.array olduğunu unutmayın. Bu, belgeleri bulmayı kolaylaştırır.


18

Bunu kullanarak buluyorum self.assertEqual(arr1.tolist(), arr2.tolist()) dizileri unittest ile karşılaştırmanın en kolay yolu .

Bunun en güzel çözüm olmadığına ve muhtemelen en hızlı olmadığına katılıyorum, ancak muhtemelen geri kalan test durumlarınız için daha tekdüze, tüm unittest hata açıklamasını alırsınız ve uygulaması gerçekten basittir.


1
Bu iyi çalışmaz Not np.nanyana np.nan != np.nanve self.assertEqualgirişimi bunun için hesaba mümkün olmayacaktır.
blacksite

5

Python 3.2'den beri kullanabilirsiniz assertSequenceEqual(array1.tolist(), array2.tolist()) .

Bu, size dizilerin farklı olduğu tam öğeleri gösterme katma değerine sahiptir.


5
Maalesef, diziler floattip olduğunda iyi çalışmıyor . Gerçekten ihtiyacımız varassertSequenceAlmostEqual
grwlf

4

Testlerimde şunu kullanıyorum:

try:
    numpy.testing.assert_array_equal(arr1, arr2)
    res = True
except AssertionError as err:
    res = False
    print (err)
self.assertTrue(res)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.