[解決済み] 'and' (boolean) vs '&' (bitwise) - なぜリストとnumpy配列で動作が異なるのですか?
質問
リストと 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
と共に&
.
関連
-
ピロウズ画像色処理の具体的な活用方法
-
PicgoのイメージベッドツールをPythonで実装する
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み] データ型が理解できない
-
[解決済み】TypeError: re.findall()でバイトのようなオブジェクトに文字列パターンを使用することはできません。)
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み] リストにおけるdel、remove、popの違いについて
-
[解決済み] リストとタプルの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
python call matlab メソッドの詳細
-
Python百行で韓服サークルの画像クロールを実現する
-
Evidentlyを用いたPythonデータマイニングによる機械学習モデルダッシュボードの作成
-
Python 入出力と高次代入の基礎知識
-
[解決済み】TypeErrorの修正方法。Unicodeオブジェクトは、ハッシュ化する前にエンコードする必要がある?
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない