Какой самый простой способ сравнить два массива NumPy на равенство (где равенство определяется как: A = B тогда и только для всех индексов i:) A[i] == B[i]
?
Простое использование ==
дает мне логический массив:
>>> numpy.array([1,1,1]) == numpy.array([1,1,1])
array([ True, True, True], dtype=bool)
Обязательно ли and
элементы этого массива, чтобы определить, равны ли массивы, или есть более простой способ сравнения?
python
arrays
numpy
elementwise-operations
clstaudt
источник
источник
np.array_equal
IME.(A==B).all()
произойдет сбой, если A и B имеют разную длину . Начиная с версии 1.10, == в этом случае выдает предупреждение об устаревании .nan!=nan
подразумевает этоarray(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 - унитарная матрица, поэтому H xH.T.conj
- единичная матрица. Ноnp.array_equal
возвращает Ложь(A==B).all()
Решение очень аккуратно, но есть некоторые встроенные функции для выполнения этой задачи. А именноarray_equal
,allclose
аarray_equiv
.(Хотя некоторые быстрые тесты, по-
timeit
видимому, указывают на то, что(A==B).all()
метод является самым быстрым, что немного странно, учитывая, что ему нужно выделить целый новый массив.)источник
(A==B).all()
. Например, попробуйте:,(np.array([1])==np.array([])).all()
он даетTrue
, аnp.array_equal(np.array([1]), np.array([]))
даетFalse
(a==b).all()
все равно быстрее, чемnp.array_equal(a, b)
(который мог бы просто проверить один элемент и выйти).np.array_equal
также работает сlists of arrays
иdicts of arrays
. Это может быть причиной снижения производительности.allclose
, это то, что мне нужно для численных расчетов. Он сравнивает равенство векторов в пределах допуска . :)np.array_equiv([1,1,1], 1) is True
. Это связано с тем, что: согласованная форма означает, что они либо имеют одинаковую форму, либо один входной массив может быть передан для создания такой же формы, что и другой.Давайте измерим производительность, используя следующий фрагмент кода.
Вывод
Согласно приведенным выше результатам, numpy-методы кажутся быстрее, чем комбинация оператора == и метода all (), и, сравнивая numpy-методы, самым быстрым кажется метод numpy.array_equal .
источник
Если вы хотите проверить, имеют ли два массива одинаковые
shape
ANDelements
, следует использоватьnp.array_equal
метод, рекомендованный в документации.Так что в равной степени, не нужно говорить о скорости.
В
(A==B).all()
ведет себя довольно много , как в следующем фрагменте кода:источник
Обычно два массива будут иметь небольшие числовые ошибки,
Вы можете использовать
numpy.allclose(A,B)
вместо(A==B).all()
. Возвращает bool True / Falseисточник
Сейчас пользуюсь
np.array_equal
. Из документации:источник