Il modo migliore per affermare l'uguaglianza numpy.array?


103

Voglio eseguire alcuni unit test per la mia app e devo confrontare due array. Poiché array.__eq__restituisce un nuovo array (quindi TestCase.assertEqualfallisce), qual è il modo migliore per affermare l'uguaglianza?

Attualmente sto usando

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

ma non mi piace molto


1
nota che il tuo esempio può produrre True in modo imprevisto, ad es. (np.array([1, 1]) == np.array([1])).all()restituirà True
M. Bernhardt

self.assertTrue (np.array_equal (array1, array2))
Miszo97

Risposte:


120

controlla le funzioni di asserzione in numpy.testing, ad es

assert_array_equal

per gli array in virgola mobile il test di uguaglianza potrebbe non riuscire e assert_almost_equal è più affidabile.

aggiornare

Qualche versione fa ha ottenuto numpy assert_allcloseche ora è il mio preferito poiché ci permette di specificare sia l'errore assoluto che relativo e non richiede l'arrotondamento decimale come criterio di vicinanza.


18
Come interagisce con unittest? Penso che alcune parole in merito sarebbero utili.
Ramon Martinez

Non uso mai unittest. Tuttavia, funziona molto bene con i nosetest utilizzati da numpy, scipy e statsmodels. Basta usare le affermazioni all'interno di una funzione o di un metodo di test.
Josef

Questo non verifica che i due argomenti siano entrambi array numpy. Ad esempio, riuscirà su un array e un elenco. Per il test, potrebbe essere utile verificare che questi siano effettivamente array, ma immagino che richiederebbe il controllo manuale del tipo?
max

4
@RamonMartinez assert_allclose sembra giocare bene con unittest :)
kotakotakota

4
@RamonMartinez se usi Python unittestpuoi usarlo self.assertIsNone(np.testing.assert_array_equal(a, b))poiché restituisce Nonese gli array sono uguali.
mjkrause

24

Penso che sia (arr1 == arr2).all()molto carino. Ma potresti usare:

numpy.allclose(arr1, arr2)

ma non è proprio la stessa cosa.

Un'alternativa, quasi uguale al tuo esempio è:

numpy.alltrue(arr1 == arr2)

Nota che scipy.array è in realtà un riferimento numpy.array. Ciò semplifica la ricerca della documentazione.


18

Lo trovo usando self.assertEqual(arr1.tolist(), arr2.tolist()) sia il modo più semplice per confrontare gli array con unittest.

Sono d'accordo che non sia la soluzione più carina e probabilmente non è la più veloce, ma probabilmente è più uniforme con il resto dei tuoi casi di test, ottieni tutte le descrizioni degli errori più unite ed è davvero semplice da implementare.


1
Nota che questo non funzionerà bene con np.nan, poiché np.nan != np.nane il self.assertEqualtentativo non sarà in grado di spiegarlo.
blacksite

5

A partire da Python 3.2 puoi usare assertSequenceEqual(array1.tolist(), array2.tolist()).

Questo ha il valore aggiunto di mostrarti gli elementi esatti in cui gli array differiscono.


5
Sfortunatamente, non funziona bene quando gli array sono di floattipo. Abbiamo davvero bisognoassertSequenceAlmostEqual
grwlf

3

Nei miei test lo uso:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.