6.8. 演算子

numpyndarray 上で実行する最初の種類の数学は、標準的な Python 演算子です。算術演算子、比較演算子、ビット演算子はすべて要素ごとに動作します。各演算子は単一のライブラリ呼び出しの中で配列(または両方の配列)を最初から最後まで一度走査し、同等の Python の for ループよりもはるかに高速です。

6.8.1. 算術

+-*///%** はすべて、互換性のある形状の2つの配列の間、または配列とスカラーの間で動作します:

a = np.array([1, 2, 3, 4], dtype=np.float)
b = np.array([10, 20, 30, 40], dtype=np.float)

print(a + b)        # array([11.0, 22.0, 33.0, 44.0])
print(a * 2)        # array([2.0, 4.0, 6.0, 8.0])
print(b - a)        # array([9.0, 18.0, 27.0, 36.0])
print(b / a)        # array([10.0, 10.0, 10.0, 10.0])

結果の dtype は Dtype で説明されているアップキャストのルールに従います。整数配列はオーバーフロー時にラップアラウンドします。それが問題になる場合は、演算の前により広い dtype にキャストしてください。

行列乗算演算子 @ は実装されていません。行列積・ベクトル積には dot() を使ってください。

6.8.1.1. インプレース形式

すべての算術演算子にはインプレース形式があります -- +=-=*=/=%=**= です。インプレース形式は一時オブジェクトを割り当てる代わりに既存のバッファに書き込みます:

b = b + 1            # allocates a temporary the size of b
b += 1               # no temporary

マイクロコントローラ上では、あらゆるホットループにおいて2番目の形式は事実上必須です。

6.8.2. ビット演算

ビット演算子 &|^ は整数配列に対して要素ごとに動作します。float または complex 配列に適用すると TypeError を送出します:

a = np.array([0b1100, 0b1010], dtype=np.uint8)
b = np.array([0b1010, 0b1100], dtype=np.uint8)
print(a & b)        # array([8, 8], dtype=uint8)
print(a | b)        # array([14, 14], dtype=uint8)
print(a ^ b)        # array([6, 6], dtype=uint8)

単項の ~ は整数配列に対してビット単位の NOT を実行します。

シフト演算子 <<>> は Python 演算子レベルでは接続されていません。関数形式の left_shift()right_shift() は動作します:

np.left_shift(a, 2)
np.right_shift(b, 1)

6.8.3. 比較

==!=<<=>>= はすべて、ブロードキャスト形状の bool ndarray を返します:

a = np.array([1, 2, 3, 4, 5], dtype=np.uint8)
print(a < 3)
# array([True, True, False, False, False], dtype=bool)

このブール値の結果は、まさに インデックス指定選択と並べ替え が消費するものです。

6.8.3.1. 辺のルール

ndarray は、スカラーと比較するとき、関係演算子の左辺なければなりませんa > 2 は動作しますが、2 < aTypeError を送出します。対称的な形式には関数名を使ってください:

np.greater(5, a)        # 5 > a, element-wise
np.less(5, a)           # 5 < a, element-wise
np.equal(5, a)          # 5 == a, element-wise
np.not_equal(5, a)      # 5 != a, element-wise

6.8.4. 単項演算子

  • +a -- 配列のコピーを返します。

  • -a -- 符号反転。符号なし dtype では、二項演算子と同じように値は \(2^N\) を法としてラップアラウンドします。

  • abs(a) -- 要素ごとの絶対値。符号なし dtype では計算なしでコピーを返します。

  • ~a -- ビット単位の反転(整数配列のみ)。

  • len(a) -- Python のシーケンスの慣例に合わせて、最初の軸の長さを返します。

6.8.5. 欠けているもの

比較演算子の右辺演算子と一部のビット演算は、算術演算子と同じようには実装されていません。ndarray が右辺に来る場合は、関数形式(上記)を使ってください。

サポートされている演算子の完全なリストと、それらが従うアップキャストについては、numpy --- numpy互換の配列操作 を参照してください。