Jaki jest najprostszy sposób porównania dwóch tablic NumPy dla równości (gdzie równość jest zdefiniowana jako: A = B iff dla wszystkich wskaźników i:) A[i] == B[i]
?
Proste użycie ==
daje mi tablicę boolowską:
>>> numpy.array([1,1,1]) == numpy.array([1,1,1])
array([ True, True, True], dtype=bool)
Czy muszę and
elementów tej tablicy, aby ustalić, czy tablice są równe, czy też istnieje prostszy sposób na porównanie?
python
arrays
numpy
elementwise-operations
clstaudt
źródło
źródło
np.array_equal
IME.(A==B).all()
ulegnie awarii, jeśli A i B mają różne długości . Począwszy od numpy 1.10, == podnosi ostrzeżenie o rezygnacji w tym przypadku .nan!=nan
implikuje toarray(nan)!=array(nan)
.import numpy as np
H = 1/np.sqrt(2)*np.array([[1, 1], [1, -1]]) #hadamard matrix
np.array_equal(H.dot(H.T.conj()), np.eye(len(H))) # checking if H is an unitary matrix or not
H jest macierzą jednolitą, więc H xH.T.conj
jest macierzą tożsamości. Alenp.array_equal
zwraca False(A==B).all()
Rozwiązanie jest bardzo schludny, ale istnieją pewne wbudowane funkcje dla tego zadania. Mianowiciearray_equal
,allclose
iarray_equiv
.(Chociaż niektóre szybkie testy
timeit
wydają się wskazywać, że(A==B).all()
metoda jest najszybsza, co jest nieco dziwne, biorąc pod uwagę, że musi ona przydzielić całą nową tablicę.)źródło
(A==B).all()
. Na przykład spróbuj(np.array([1])==np.array([])).all()
True
np.array_equal(np.array([1]), np.array([]))
False
(a==b).all()
wciąż jest szybsze niżnp.array_equal(a, b)
(które mogły po prostu sprawdzić pojedynczy element i wyjść).np.array_equal
działa również zlists of arrays
idicts of arrays
. Może to być przyczyną wolniejszej pracy.allclose
, właśnie tego potrzebowałem do obliczeń numerycznych . Porównuje równość wektorów w ramach tolerancji . :)np.array_equiv([1,1,1], 1) is True
. Wynika to z faktu, że: Zgodny z kształtem oznacza, że mają albo ten sam kształt, albo jedna tablica wejściowa może być rozgłaszana, aby utworzyć ten sam kształt co drugi.Zmierzmy wydajność za pomocą następującego fragmentu kodu.
Wynik
Zgodnie z powyższymi wynikami metody numpy wydają się być szybsze niż połączenie operatora == i metody all () , a przez porównanie metod numpy najszybszą wydaje się metoda numpy.array_equal .
źródło
Jeśli chcesz sprawdzić, czy dwie tablice mają takie same
shape
ORAZelements
powinieneś użyć,np.array_equal
ponieważ jest to metoda zalecana w dokumentacji.Tak prawie równe, nie trzeba mówić o prędkości.
Że
(A==B).all()
zachowuje się dość dużo jak poniższym fragmencie kodu:źródło
Zwykle w dwóch tablicach występują niewielkie błędy numeryczne,
Możesz użyć
numpy.allclose(A,B)
zamiast(A==B).all()
. Zwraca bool Prawda / Fałszźródło
Teraz użyj
np.array_equal
. Z dokumentacji:źródło