'and' (ブール値) と '&' (ビット単位) - リストと NumPy 配列の動作に違いがあるのはなぜですか? 質問する

'and' (ブール値) と '&' (ビット単位) - リストと NumPy 配列の動作に違いがあるのはなぜですか? 質問する

リストと 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、 の真理値はand2 番目のリストの真理値と同じになります。(この例では、2 番目のリストは空でないため論理的に となりますTrueが、それを識別するには不必要な計算手順が必要になります。)

たとえば、2 番目のリストは、任意の異なる要素を含むことができるため、ビット単位で結合することはできません。ビット単位で結合できるものには、True と False、整数などがあります。

対照的に、NumPy オブジェクトはベクトル化された計算をサポートします。つまり、複数のデータに対して同じ操作を実行できます。

例 3 は、NumPy 配列 (長さ > 1) には真理値がないため失敗します。これにより、ベクトルベースのロジックの混乱を防ぐことができます。

例 4 は単純にベクトル化されたビットand操作です。

結論

  • 配列を扱わず、整数の数学操作も実行しない場合は、おそらく が必要になりますand

  • 結合したい真理値のベクトルがある場合は、numpyを使用します&

おすすめ記事