Нашли ошибку?
базовыйNumPy 2.5.3

Сравнение массивов

Почему a == b не отвечает «равны ли массивы» и чем проверять равенство целиком — точно и с допуском.

Нужно знать:Арифметика с массивами

Содержание статьи

Коротко

  • a == b, a < b и другие сравнения работают поэлементно и возвращают массив True/False, а не одно значение.
  • Поэтому if a == b: падает: Python не знает, как превратить массив в одно True или False.
  • Равенство целиком — np.array_equal(a, b): одинаковые форма и все элементы.
  • Дробные числа сравнивают с допуском: np.allclose (целиком) и np.isclose (поэлементно).
  • NaN не равен ничему, даже себе; для сравнения с учётом NaN есть equal_nan=True.

Синтаксис

a == b                         # поэлементно → массив bool
(a == b).all()                 # все ли совпали (формы должны совпадать)
np.array_equal(a, b, equal_nan=False)
np.allclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)
np.isclose(a, b, rtol=1e-05, atol=1e-08)   # поэлементно

Параметры

ПараметрЧто делаетПо умолчанию
rtolотносительный допуск: разрешённая разница — rtol × |b|1e-05
atolабсолютный допуск; важен для значений около нуля1e-08
equal_nanсчитать NaN равным NaNFalse

Условие близости: |a − b| <= atol + rtol × |b|.

Примеры

Данные для примеровиспользуются во всех примерах ниже
plan = np.array([100, 120, 90])   # план продаж
fact = np.array([100, 115, 95])   # факт
Поэлементное сравнение
print(plan == fact)
fact >= plan
Вывод
[ True False False]
array([ True, False,  True])
Равны ли массивы целиком
print(np.array_equal(plan, fact))
print(np.array_equal(plan, [100, 120, 90]))
np.array_equal(plan, [100, 120])          # другая форма — просто False
Вывод
False
True
False
Сравнение дробных чисел
x = np.array([0.1 + 0.2, 1 / 3 * 3])
print(x == np.array([0.3, 1.0]))
print(np.isclose(x, [0.3, 1.0]))
np.allclose(x, [0.3, 1.0])
Вывод
[False  True]
[ True  True]
True
Свой допуск
measured = np.array([9.98, 20.03])
print(np.allclose(measured, [10, 20]))              # по умолчанию допуск очень мал
np.allclose(measured, [10, 20], atol=0.05)
Вывод
False
True

Подводные камни

if a == b

Проверка в if требует одно значение. Решите, что вы имеете в виду: «все равны» — np.array_equal(a, b) или (a == b).all(), «хоть один равен» — (a == b).any().

Массив в условии ifошибка: ValueError
if plan == fact:
    print("план выполнен")
Ошибка
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

NaN не равен себе

Два массива с NaN в одних и тех же местах array_equal по умолчанию считает разными.

Сравнение с NaN
a = np.array([1.0, np.nan])
print(a == a)
print(np.array_equal(a, a))
np.array_equal(a, a, equal_nan=True)
Вывод
[ True False]
False
True