¿Cuál es la forma más simple de comparar dos matrices NumPy para la igualdad (donde la igualdad se define como: A = B iff para todos los índices i:) A[i] == B[i]
?
Simplemente usando ==
me da una matriz booleana:
>>> numpy.array([1,1,1]) == numpy.array([1,1,1])
array([ True, True, True], dtype=bool)
¿Tengo que ver and
los elementos de esta matriz para determinar si las matrices son iguales o hay una forma más sencilla de comparar?
python
arrays
numpy
elementwise-operations
clstaudt
fuente
fuente
np.array_equal
IME.(A==B).all()
se bloqueará si A y B tienen longitudes diferentes . A partir de 1.10 numpy, == genera una advertencia de desaprobación en este caso .nan!=nan
implica esoarray(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 es una matriz unitaria, entonces H xH.T.conj
es una matriz de identidad. Peronp.array_equal
regresa FalseLa
(A==B).all()
solución es muy clara, pero hay algunas funciones integradas para esta tarea. A saberarray_equal
,allclose
yarray_equiv
.(Aunque, algunas pruebas rápidas
timeit
parecen indicar que el(A==B).all()
método es el más rápido, lo cual es un poco peculiar, dado que tiene que asignar una matriz completamente nueva).fuente
(A==B).all()
. Por ejemplo, intente:,(np.array([1])==np.array([])).all()
daTrue
, mientrasnp.array_equal(np.array([1]), np.array([]))
daFalse
(a==b).all()
aún es más rápido quenp.array_equal(a, b)
(lo que podría haber verificado un solo elemento y haber salido).np.array_equal
También trabaja conlists of arrays
ydicts of arrays
. Esto podría ser una razón para un rendimiento más lento.allclose
, eso es lo que necesitaba para los cálculos numéricos . Compara la igualdad de vectores dentro de una tolerancia . :)np.array_equiv([1,1,1], 1) is True
. Esto se debe a que: Forma consistente significa que tienen la misma forma o que se puede emitir una matriz de entrada para crear la misma forma que la otra.Midamos el rendimiento utilizando el siguiente código.
Salida
De acuerdo con los resultados anteriores, los métodos numpy parecen ser más rápidos que la combinación del operador == y el método all () y al comparar los métodos numpy, el más rápido parece ser el método numpy.array_equal .
fuente
Si desea verificar si dos matrices tienen el mismo
shape
Yelements
debe usar,np.array_equal
ya que es el método recomendado en la documentación.Casi igual, no hay necesidad de hablar sobre la velocidad.
El se
(A==B).all()
comporta más o menos como el siguiente fragmento de código:fuente
Por lo general, dos matrices tendrán algunos pequeños errores numéricos,
Puedes usar
numpy.allclose(A,B)
, en lugar de(A==B).all()
. Esto devuelve un bool verdadero / falsofuente
Ahora usa
np.array_equal
. De la documentación:fuente