Qual é a maneira mais simples de comparar duas matrizes NumPy para igualdade (onde igualdade é definida como: A = B iff para todos os índices i:) A[i] == B[i]
?
Simplesmente usar ==
me fornece uma matriz booleana:
>>> numpy.array([1,1,1]) == numpy.array([1,1,1])
array([ True, True, True], dtype=bool)
Preciso and
dos elementos dessa matriz para determinar se as matrizes são iguais ou se há uma maneira mais simples de comparar?
python
arrays
numpy
elementwise-operations
clstaudt
fonte
fonte
np.array_equal
IME.(A==B).all()
irá falhar se A e B têm diferentes comprimentos . A partir do numpy 1.10, == gera um aviso de descontinuação neste caso .nan!=nan
implica issoarray(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 é uma matriz unitária, então H xH.T.conj
é uma matriz de identidade. Masnp.array_equal
retorna FalseA
(A==B).all()
solução é muito elegante, mas existem algumas funções internas para esta tarefa. Ou sejaarray_equal
,allclose
earray_equiv
.(Embora alguns testes rápidos
timeit
pareçam indicar que o(A==B).all()
método é o mais rápido, o que é um pouco peculiar, já que ele precisa alocar uma matriz totalmente nova).fonte
(A==B).all()
. Por exemplo, tente(np.array([1])==np.array([])).all()
True
np.array_equal(np.array([1]), np.array([]))
False
(a==b).all()
ainda será mais rápido do quenp.array_equal(a, b)
(o que poderia ter verificado apenas um elemento e ter sido encerrado).np.array_equal
também trabalha comlists of arrays
edicts of arrays
. Isso pode ser um motivo para um desempenho mais lento.allclose
, era disso que eu precisava para cálculos numéricos . Ele compara a igualdade de vetores dentro de uma tolerância . :)np.array_equiv([1,1,1], 1) is True
. Isso ocorre porque: Forma consistente significa que eles têm a mesma forma ou uma matriz de entrada pode ser transmitida para criar a mesma forma que a outra.Vamos medir o desempenho usando o seguinte trecho de código.
Resultado
De acordo com os resultados acima, os métodos numpy parecem ser mais rápidos que a combinação do operador == e o método all () e, comparando os métodos numpy, o mais rápido parece ser o método numpy.array_equal .
fonte
Se você deseja verificar se duas matrizes têm o mesmo
shape
AND,elements
você deve usá-np.array_equal
lo, pois é o método recomendado na documentação.Tão praticamente igual, não há necessidade de falar sobre a velocidade.
O
(A==B).all()
comportamento se comporta praticamente como o seguinte trecho de código:fonte
Normalmente, duas matrizes apresentam pequenos erros numéricos,
Você pode usar
numpy.allclose(A,B)
, em vez de(A==B).all()
. Isso retorna um booleano Verdadeiro / Falsofonte
Agora use
np.array_equal
. Da documentação:fonte