La forma más rápida de comparar dos matrices numpy

Tengo dos matrices:

>>> import numpy as np >>> a=np.array([2, 1, 3, 3, 3]) >>> b=np.array([1, 2, 3, 3, 3]) 

¿Cuál es la forma más rápida de comparar estas dos matrices para la igualdad de elementos, independientemente del orden?

EDIT I mide los tiempos de ejecución de las siguientes funciones:

 def compare1(): #works only for arrays without redundant elements a=np.array([1,2,3,5,4]) b=np.array([2,1,3,4,5]) temp=0 for i in a: temp+=len(np.where(b==i)[0]) if temp==5: val=True else: val=False return 0 def compare2(): a=np.array([1,2,3,3,3]) b=np.array([2,1,3,3,3]) val=np.all(np.sort(a)==np.sort(b)) return 0 def compare3(): #thx to ODiogoSilva a=np.array([1,2,3,3,3]) b=np.array([2,1,3,3,3]) val=set(a)==set(b) return 0 import numpy.lib.arraysetops as aso def compare4(): #thx to tom10 a=np.array([1,2,3,3,3]) b=np.array([2,1,3,3,3]) val=len(aso.setdiff1d(a,b))==0 return 0 

Los resultados son:

 >>> import timeit >>> timeit.timeit(compare1,number=1000) 0.0166780948638916 >>> timeit.timeit(compare2,number=1000) 0.016178131103515625 >>> timeit.timeit(compare3,number=1000) 0.008063077926635742 >>> timeit.timeit(compare4,number=1000) 0.03257489204406738 

Parece que el método “set” de ODiogoSilva es el más rápido.

¿Conoces otros métodos que también pueda probar?

EDIT2 El tiempo de ejecución anterior no fue la medida correcta para comparar arrays, como se explica en un comentario por el usuario2357112.

 #test.py import numpy as np import numpy.lib.arraysetops as aso #without duplicates N=10000 a=np.arange(N,0,step=-2) b=np.arange(N,0,step=-2) def compare1(): temp=0 for i in a: temp+=len(np.where(b==i)[0]) if temp==len(a): val=True else: val=False return val def compare2(): val=np.all(np.sort(a)==np.sort(b)) return val def compare3(): val=set(a)==set(b) return val def compare4(): val=len(aso.setdiff1d(a,b))==0 return val 

La salida es:

 >>> from test import * >>> import timeit >>> timeit.timeit(compare1,number=1000) 101.16708397865295 >>> timeit.timeit(compare2,number=1000) 0.09285593032836914 >>> timeit.timeit(compare3,number=1000) 1.425955057144165 >>> timeit.timeit(compare4,number=1000) 0.44780397415161133 

Ahora compare2 es el más rápido. ¿Todavía hay un método que podría superar esto?

Numpy como una colección de operaciones de conjunto.

 import numpy as np import numpy.lib.arraysetops as aso a=np.array([2, 1, 3, 3, 3]) b=np.array([1, 2, 3, 3, 3]) print aso.setdiff1d(a, b) 

Para ver si ambas matrices contienen el mismo tipo de elementos, en este caso [1,2,3], podría hacer:

 import numpy as np a=np.array([2, 1, 3, 3, 3]) b=np.array([1, 2, 3, 3, 3]) set(a) == set(b) # True