1. ホーム
  2. python

[解決済み] 'and' (boolean) vs '&' (bitwise) - なぜリストとnumpy配列で動作が異なるのですか?

2022-04-22 17:50:42

質問

リストと 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の配列は、これらの演算子で異なる動作をするのでしょうか?

どなたか、boolean演算とbitwise演算の違いを理解して、なぜリストとNumPy配列の扱いが違うのかを説明する手助けをしていただけませんか?

どのように解決するのですか?

and は、両方の式が論理的に正しいかどうかをテストします。 True 一方 & (と一緒に使用した場合)。 True / False の値) は、両方が True .

Pythonでは、空の組み込みオブジェクトは通常、論理的に次のように扱われます。 False 一方、空でないビルトインは、論理的に True . これにより、リストが空の場合は何か、空でない場合は別のことをしたい、というような一般的なユースケースを容易にすることができます。これは、リスト[False]が論理的に True :

>>> if [False]:
...    print 'True'
...
True

つまり、例1では、最初のリストは空でないため、論理的に True の真理値は and は、2番目のリストのそれと同じです。(この場合、2番目のリストは空ではないので、論理的には True しかし、それを特定するためには、無駄な計算が必要となる)。

例2として、リストには任意の異なる要素を含むことができるため、ビット単位での結合は意味を持ちません。ビット単位で結合できるものには、次のようなものがあります。真と偽、整数。

これに対して、NumPyのオブジェクトは、ベクトル化された計算をサポートします。つまり、複数のデータに対して同じ演算を行うことができるのです。

例3は、NumPyの配列(長さ >1)には真理値がないため、ベクトルベースの論理の混乱を防ぐため、失敗します。

例4は、単純にベクトル化したビット and 演算を行います。

ボトムライン

  • 配列を扱わず、整数の演算を行わないのであれば、おそらくは and .

  • 結合したい真理値のベクトルがある場合は numpy と共に & .