Чем объясняется разница в поведении логических и побитовых операций над списками и массивами NumPy?
Меня смущает правильное использование &
и and
в Python, что проиллюстрировано в следующих примерах.
mylist1 = [True, True, True, False, True]
mylist2 = [False, True, False, True, False]
>>> len(mylist1) == len(mylist2)
True
# ---- Example 1 ----
>>> mylist1 and mylist2
[False, True, False, True, False]
# I would have expected [False, True, False, False, False]
# ---- Example 2 ----
>>> mylist1 & mylist2
TypeError: unsupported operand type(s) for &: 'list' and 'list'
# Why not just like example 1?
>>> import numpy as np
# ---- Example 3 ----
>>> np.array(mylist1) and np.array(mylist2)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
# Why not just like Example 4?
# ---- Example 4 ----
>>> np.array(mylist1) & np.array(mylist2)
array([False, True, False, False, False], dtype=bool)
# This is the output I was expecting!
Этот ответ и этот ответ помог мне понять, что and
является логической операцией, а &
является побитовой операцией.
Я прочитал о побитовых операциях, чтобы лучше понять концепцию, но я изо всех сил стараюсь использовать эту информацию для понимания моих приведенных выше 4 примеров.
Пример 4 привел меня к желаемому выводу, так что это нормально, но я все еще не понимаю, когда/как/почему я должен использовать and
против &
. Почему списки и массивы NumPy ведут себя по-разному с этими операторами?
Может кто-нибудь помочь мне понять разницу между логическими и побитовыми операциями, чтобы объяснить, почему они по-разному обрабатывают списки и массивы NumPy?