Что объясняет разницу в поведении булевых и побитовых операций над списками vs numpy.arrays?Разница между 'и' (boolean) против '&' (побитовая) в python. Почему разница в поведении со списками против массивов numpy?
Я смущаюсь из-за соответствующего использования '&
' vs '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 am confused: I would have expected [False, True, False, False, False]
# ---- Example 2 ----
>>>mylist1 & mylist2
*** TypeError: unsupported operand type(s) for &: 'list' and 'list'
#I am confused: Why not just like example 1?
# ---- Example 3 ----
>>>import numpy as np
>>> 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()
#I am confused: 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!
Это answer, и это answer и помог мне понять, что 'and' является булевой операции, но '&' является операция поразрядного.
Я был reading некоторая информация, чтобы лучше понять концепцию bitwise operations, но я изо всех сил пытаюсь использовать эту информацию, чтобы понять мои приведенные выше 4 примера.
Обратите внимание, в моей конкретной ситуации, мой желаемый результат является NewList где:
len(newlist) == len(mylist1)
newlist[i] == (mylist1[i] and mylist2[i]) #for every element of newlist
Пример 4, выше, привело меня к желаемому выходу, так что это хорошо.
Но я остаюсь смущенным, когда/как/почему я должен использовать 'и' vs '&'. Почему списки и массивы numpy ведут себя по-разному с этими операторами?
Может ли кто-нибудь помочь мне понять разницу между булевыми и побитовыми операциями, чтобы объяснить, почему они обрабатывают списки и numpy.arrays по-разному?
Я просто хочу, чтобы я продолжал правильно использовать эти операции в будущем. Большое спасибо за помощь!
Numpy version 1.7.1
python 2.7
References all inline with text.
редактирует
1) Спасибо @delnan за указание на то, что в моих оригинальных примеров, которые я имел утра двусмысленность, которая была маскирующий мое глубокое замешательство. Я обновил свои примеры, чтобы уточнить мой вопрос.
Пример 1 только дает правильный результат. На самом деле он просто возвращает второй список без изменений. Попробуйте другие списки, в частности, все, где во втором списке содержится «True» в позиции «False» в первом списке: логическая логика диктует вывод «False» в этой позиции, но вы получите «True» , – delnan
@delnan Спасибо, что заметили двусмысленность в моих примерах. Я обновил свои примеры, чтобы подчеркнуть мое замешательство и сосредоточиться на аспекте этого поведения, которое я не понимаю. Мне явно не хватает чего-то важного, потому что я не ожидал вывода из примера 1. – rysqui
В Numpy есть '' np.bitwise_and() '' и '' np.logical_and() '' и друзья, чтобы избежать путаницы. – Dietrich