TLDR: is-сравнение работает с Python bool
и не работает с numpy bool_
.Существуют ли какие-то другие различия?
Я столкнулся со странным поведением логических выражений пару дней назад.Когда я пытался использовать is-сравнение для этого массива:
arr1 = np.array([1,0,2,0], dtype=bool)
arr1
Out[...]: array([ True, False, True, False])
(Эти имена переменных основаны на вымысле, и любое сходство с реальными именами переменных или производственным кодом является чисто случайным)
Я видел этот результат:
arr1 is True
Out[...]: False
Это было логично, потому что arr1
не является Истиной или Ложью, это - массив значений.Я проверил это:
arr1 == True
Out[...]: array([ True, False, True, False])
Это сработало, как и ожидалось.Я упомянул это милое поведение и сразу же забыл его.На следующий день я проверил истинность элементов массива:
[elem is False for elem in arr1]
и он мне это возвращает!
Out[...]: [False, False, False, False]
Я былдействительно запутался, потому что я вспомнил, что в массивах Python (я думал, что проблема в поведении массивов):
arr2 = [True, False, True, False]
[elem is False for elem in arr2]
это работает:
Out[...]: [False, True, False, True]
Более того,он работал в моем другом массиве:
very_cunning_arr = np.array([1, False, 2, False, []])
[elem is False for elem in very_cunning_arr]
Out[...]: [False, True, False, True, False]
Когда я погрузился в свой массив, я обнаружил, что very_cunning_arr
был построен numpy.object
из-за парынечисловые элементы, поэтому он содержит Python bools и arr1
был построен как numpy.bool_
.Поэтому я проверил их поведение:
numpy_waka = np.bool_(True)
numpy_waka
Out[...]: True
python_waka = True
python_waka
Out[...]: True
[numpy_waka is True, python_waka is True]
И я наконец нашелразница:
Out[...]: [False, True]
После всего этого у меня есть два вопроса:
- У
numpy.bool_
и bool
есть некоторые другие различия в их общихповедение?(Я знаю, что numpy.bool_
имеет много функций и параметров numpy, например, .T
и других) - Как проверить, содержит ли массив numpy только numy booleans, без Pythonic bools?
(PS: Да, СЕЙЧАС Я знаю, что сравнивать с True / False с is
плохо):
Не сравнивать логические значения с True или Falseиспользуя ==.
Yes: if greeting:
No: if greeting == True:
Worse: if greeting is True:
Edit 1: Как уже упоминалось в другой вопрос , numpy имеет свой собственный тип bool_
.Но детали этого вопроса немного отличаются: я обнаружил, что операторы is работают по-разному, но до этого различия - есть ли что-то другое в обычном поведении bool_
и bool
?Если да, то что именно?