it-swarm.com.de

Vergleichen von zwei 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 Elemente dieses Arrays and angeben, um festzustellen, ob die Arrays gleich sind, oder gibt es eine einfachere Möglichkeit zum Vergleichen?

192
clstaudt
(A==B).all()

testen Sie, ob alle Werte des Arrays (A == B) True sind.

Bearbeiten (aus dbaupps antwort und yoavrams kommentar)

Es ist darauf hinzuweisen, dass:

  • diese Lösung kann in bestimmten Fällen ein seltsames Verhalten aufweisen: Wenn entweder A oder B leer ist und die andere ein einzelnes Element enthält, wird True zurückgegeben. Aus irgendeinem Grund ist der Vergleich A==B gibt ein leeres Array zurück, für das der Operator allTrue zurückgibt.
  • Ein weiteres Risiko besteht darin, dass dieser Ansatz einen Fehler auslöst, wenn A und B nicht dieselbe Form haben und nicht rundgesendet werden können.

Zusammenfassend ist die von mir vorgeschlagene Lösung die Standardlösung, aber wenn Sie Zweifel an der Form von A und B haben oder einfach nur sicher sein möchten: 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
291
Juh_

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

(Obwohl einige schnelle Tests mit timeit darauf hindeuten, dass der (A==B).all() Methode ist die schnellste, was etwas eigenartig ist, da sie ein ganz neues Array zuweisen muss.)

81
huon

Lassen Sie uns die Leistung mit dem folgenden Code 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

Gemäß den obigen Ergebnissen scheinen die numpy-Methoden schneller zu sein als die Kombination des Operators == und der Methode all () und durch Vergleichen der numpy-Methoden der schnellste man scheint die numpy.array_equal Methode zu sein.

13
funk

Wenn Sie überprüfen möchten, ob zwei Arrays das gleiche shape UND elements haben, sollten Sie np.array_equal Verwenden, da dies die in der Dokumentation empfohlene Methode ist.

In Bezug auf die Leistung sollten Sie nicht damit rechnen, dass eine Gleichheitsprüfung eine andere übertrifft, da nicht viel Optimierungsspielraum besteht comparing two elements. Ich habe noch ein paar Tests gemacht.

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

So ziemlich gleich, keine Notwendigkeit, über die Geschwindigkeit zu sprechen.

Das (A==B).all() Verhält sich wie das folgende Code-Snippet:

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