Коротко
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-05atolабсолютный допуск; важен для значений около нуля1e-08equal_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 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 по умолчанию считает разными.
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