リストと NumPy 配列におけるブール演算とビット演算の動作の違いを説明するものは何ですか?
次の例に示すように、Python での&
vsの適切な使用法がわかりません。and
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 つの例を理解するのに苦労しています。
and
例 4 で目的の出力が得られましたので問題ありませんが、 vs をいつ、どのように、なぜ使用すべきかまだわかりません&
。リストと NumPy 配列がこれらの演算子で異なる動作をするのはなぜですか?
ブール演算とビット演算の違いを理解し、リストと NumPy 配列を異なる方法で処理する理由を説明してくれる人はいませんか?
ベストアンサー1
and
両方の式が論理的にかどうかをテストしTrue
、&
( True
/False
値と共に使用した場合) は両方が であるかどうかをテストしますTrue
。
Python では、空の組み込みオブジェクトは通常、論理的に として扱われFalse
、空でない組み込みオブジェクトは論理的に として扱われますTrue
。これにより、リストが空の場合に何かを実行し、リストが空でない場合は別の何かを実行するという一般的な使用例が容易になります。これは、リスト [False] が論理的に であることを意味することに注意してくださいTrue
。
>>> if [False]:
... print('True')
...
True
したがって、例 1 では、最初のリストは空でないため論理的に となりTrue
、 の真理値はand
2 番目のリストの真理値と同じになります。(この例では、2 番目のリストは空でないため論理的に となりますTrue
が、それを識別するには不必要な計算手順が必要になります。)
たとえば、2 番目のリストは、任意の異なる要素を含むことができるため、ビット単位で結合することはできません。ビット単位で結合できるものには、True と False、整数などがあります。
対照的に、NumPy オブジェクトはベクトル化された計算をサポートします。つまり、複数のデータに対して同じ操作を実行できます。
例 3 は、NumPy 配列 (長さ > 1) には真理値がないため失敗します。これにより、ベクトルベースのロジックの混乱を防ぐことができます。
例 4 は単純にベクトル化されたビットand
操作です。
結論
配列を扱わず、整数の数学操作も実行しない場合は、おそらく が必要になります
and
。結合したい真理値のベクトルがある場合は、
numpy
を使用します&
。