442 Stimmen

Vergleich zweier NumPy-Arrays auf Gleichheit, elementweise

Was ist der einfachste Weg, um zwei NumPy-Arrays auf Gleichheit zu vergleichen (wobei Gleichheit definiert ist als: A = B iff für alle Indizes i: A[i] == B[i] )?

Einfach mit == gibt mir ein boolesches Array:

 >>> numpy.array([1,1,1]) == numpy.array([1,1,1])

array([ True,  True,  True], dtype=bool)

Muss ich die and die Elemente dieses Arrays, um festzustellen, ob die Arrays gleich sind, oder gibt es einen einfacheren Weg, um zu vergleichen?

646voto

Juh_ Punkte 13093
(A==B).all()

prüfen, ob alle Werte der Matrix (A==B) wahr sind.

Hinweis: Vielleicht möchten Sie auch die A- und B-Form testen, z. B. A.shape == B.shape

Sonderfälle und Alternativen (aus der Antwort von dbaupp und dem Kommentar von yoavram)

Es sollte beachtet werden, dass:

  • kann diese Lösung in einem bestimmten Fall ein merkwürdiges Verhalten aufweisen: wenn entweder A o B leer ist und das andere ein einziges Element enthält, dann gibt es True . Aus irgendeinem Grund ist der Vergleich A==B gibt ein leeres Array zurück, für das die all Operator kehrt zurück True .
  • Ein weiteres Risiko besteht darin, dass A y B nicht die gleiche Form haben und nicht übertragbar sind, führt dieser Ansatz zu einem Fehler.

Zusammenfassend lässt sich sagen, dass Sie, wenn Sie Zweifel haben an A y B Form oder wollen Sie einfach nur sicher sein: Verwenden Sie eine der speziellen Funktionen:

np.array_equal(A,B)  # test if same shape, same elements values
np.array_equiv(A,B)  # test if broadcastable shape, same elements values
np.allclose(A,B,...) # test if same shape, elements have close enough values

132voto

huon Punkte 84005

En (A==B).all() Lösung ist sehr übersichtlich, aber es gibt einige integrierte Funktionen für diese Aufgabe. Nämlich array_equal , allclose y array_equiv .

(Obwohl einige schnelle Tests mit timeit scheint darauf hinzudeuten, dass die (A==B).all() Methode ist die schnellste, was ein wenig seltsam ist, da sie ein ganzes neues Array zuweisen muss).

22voto

user1767754 Punkte 20816

Wenn Sie prüfen wollen, ob zwei Arrays die gleiche shape UND elements sollten Sie np.array_equal da dies die in der Dokumentation empfohlene Methode ist.

Erwarten Sie nicht, dass eine Gleichheitsprüfung eine andere übertrifft, da es nicht viel Spielraum für Optimierungen gibt. comparing two elements . Nur um der Sache willen habe ich noch einige Tests durchgeführt.

import numpy as np
import timeit

A = np.zeros((300, 300, 3))
B = np.zeros((300, 300, 3))
C = np.ones((300, 300, 3))

timeit.timeit(stmt='(A==B).all()', setup='from __main__ import A, B', number=10**5)
timeit.timeit(stmt='np.array_equal(A, B)', setup='from __main__ import A, B, np', number=10**5)
timeit.timeit(stmt='np.array_equiv(A, B)', setup='from __main__ import A, B, np', number=10**5)
> 51.5094
> 52.555
> 52.761

Also ziemlich gleich, kein Grund, über die Geschwindigkeit zu reden.

En (A==B).all() verhält sich in etwa wie der folgende Codeschnipsel:

x = [1,2,3]
y = [1,2,3]
print all([x[i]==y[i] for i in range(len(x))])
> True

17voto

funk Punkte 1881

Lassen Sie uns die Leistung mit dem folgenden Code-Stück messen.

import numpy as np
import time

exec_time0 = []
exec_time1 = []
exec_time2 = []

sizeOfArray = 5000
numOfIterations = 200

for i in xrange(numOfIterations):

    A = np.random.randint(0,255,(sizeOfArray,sizeOfArray))
    B = np.random.randint(0,255,(sizeOfArray,sizeOfArray))

    a = time.clock() 
    res = (A==B).all()
    b = time.clock()
    exec_time0.append( b - a )

    a = time.clock() 
    res = np.array_equal(A,B)
    b = time.clock()
    exec_time1.append( b - a )

    a = time.clock() 
    res = np.array_equiv(A,B)
    b = time.clock()
    exec_time2.append( b - a )

print 'Method: (A==B).all(),       ', np.mean(exec_time0)
print 'Method: np.array_equal(A,B),', np.mean(exec_time1)
print 'Method: np.array_equiv(A,B),', np.mean(exec_time2)

Ausgabe

Method: (A==B).all(),        0.03031857
Method: np.array_equal(A,B), 0.030025185
Method: np.array_equiv(A,B), 0.030141515

Nach den obigen Ergebnissen scheinen die Numpy-Methoden schneller zu sein als die Kombination der \== all() Methode und durch den Vergleich der Numpy-Methoden die schnellste einer scheint derjenige zu sein numpy.array_equal Methode.

10voto

R Zhang Punkte 189

Normalerweise haben zwei Arrays einige kleine numerische Fehler,

Sie können verwenden numpy.allclose(A,B) anstelle von (A==B).all() . Dies gibt ein bool True/False zurück

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X