numpy.ndarrayにおける演算子 | Python-izm

ndarrayにおける演算子

ndarrayクラスは演算子がオーバーロードされているため、「 + 」や「 – 」を用いての演算は独自の挙動を示します。

前提条件

ndarrayの要素は数値である必要があり、文字列などではエラーが発生します。

import numpy


# 文字列はエラー
print(numpy.array(['AB']) + numpy.array(['CD']))

比較演算子

ndarray同士の比較は、それぞれの結果を格納したndarrayが返されます。次の例の場合12の比較結果としてFalse1020False100100Trueとなります。

import numpy


array_like_1 = [1, 10, 100]
array_like_2 = [2, 20, 100]

na_1 = numpy.array(array_like_1)
na_2 = numpy.array(array_like_2)

result = na_1 == na_2
print(type(result))
print(result)
<type 'numpy.ndarray'>
[False False  True]

またndarrayとPython標準のシーケンスとの比較も可能です。戻り値はndarrayです。

import numpy


array_like_1 = [1, 10, 100]
array_like_2 = [2, 20, 100]

na_1 = numpy.array(array_like_1)
na_2 = numpy.array(array_like_2)

print(na_1 == array_like_1)
print(na_1 == array_like_2)
[ True  True  True]
[False False  True]

「 == 」以外の比較結果は以下の通りです。それぞれに格納されている数値の比較を行い、その結果が格納されたndarrayが返ります。

import numpy


array_like_1 = [1, 10, 100]
array_like_2 = [2, 20, 100]

na_1 = numpy.array(array_like_1)
na_2 = numpy.array(array_like_2)

print(na_1 != na_2)
print(na_1 < na_2)
print(na_1 <= na_2)
print(na_1 > na_2)
print(na_1 >= na_2)
[ True  True False]
[ True  True False]
[ True  True  True]
[False False False]
[False False  True]

これらの結果をまとめて判定したい場合は、Numpyのallanyを使うと良いでしょう。

import numpy


array_like_1 = [1, 10, 100]
array_like_2 = [2, 20, 100]

na_1 = numpy.array(array_like_1)
na_2 = numpy.array(array_like_2)

if numpy.all(na_1 == na_2):
    print('all')
else:
    print('not all')
not all

算術演算子

ndarray同士で「 + 」や「 – 」を用いた場合、それぞれの計算結果を格納したndarrayが返されます。次の例の場合12の計算結果として3102030100100200となります。

import numpy


array_like_1 = [1, 10, 100]
array_like_2 = [2, 20, 100]

na_1 = numpy.array(array_like_1)
na_2 = numpy.array(array_like_2)

print(na_1 + na_2)
[  3  30 200]

比較と同様に、ndarrayとPython標準のシーケンスとの計算も可能です。戻り値はndarrayです。

import numpy


array_like_1 = [1, 10, 100]
array_like_2 = [2, 20, 100]

na_1 = numpy.array(array_like_1)
na_2 = numpy.array(array_like_2)

print(na_1 + array_like_1)
print(na_1 + array_like_2)
[  2  20 200]
[  3  30 200]

「 + 」以外の計算結果は以下の通りです。それぞれに格納されている数値の計算を行い、その結果が格納されたndarrayが返ります。

import numpy


array_like_1 = [1, 10, 100]
array_like_2 = [2, 20, 100]

na_1 = numpy.array(array_like_1)
na_2 = numpy.array(array_like_2)

print(na_2 - na_1)
print(na_2 * na_1)
print(na_2 / na_1)
print(na_2 // na_1)
print(na_2 % na_1)
print(na_2 << na_1)
print(na_2 >> na_1)
print(na_2 & na_1)
print(na_2 | na_1)
print(na_2 ^ na_1)
[ 1 10  0]
[    2   200 10000]
[2 2 1]
[2 2 1]
[0 0 0]
[    4 20480  1600]
[1 0 6]
[  0   0 100]
[  3  30 100]
[ 3 30  0]

累算代入もサポートしています。

import numpy


array_like_1 = [1, 10, 100]
array_like_2 = [2, 20, 100]

na_2 = numpy.array(array_like_2)


na_1 = numpy.array(array_like_1)
na_1 += na_2
print(na_1)

na_1 = numpy.array(array_like_1)
na_1 -= na_2
print(na_1)

na_1 = numpy.array(array_like_1)
na_1 *= na_2
print(na_1)

na_1 = numpy.array(array_like_1)
na_1 //= na_2
print(na_1)

na_1 = numpy.array(array_like_1)
na_1 %= na_2
print(na_1)

na_1 = numpy.array(array_like_1)
na_1 <<= na_2
print(na_1)

na_1 = numpy.array(array_like_1)
na_1 >>= na_2
print(na_1)

na_1 = numpy.array(array_like_1)
na_1 &= na_2
print(na_1)

na_1 = numpy.array(array_like_1)
na_1 |= na_2
print(na_1)

na_1 = numpy.array(array_like_1)
na_1 ^= na_2
print(na_1)
[  3  30 200]
[ -1 -10   0]
[    2   200 10000]
[0 0 1]
[ 1 10  0]
[       4 10485760     1600]
[0 0 6]
[  0   0 100]
[  3  30 100]
[ 3 30  0]

単項演算子

単項演算子は以下の通りです。

import numpy


array_like_1 = [1, 10, 100]
array_like_2 = [-2, -20, -100]

na_1 = numpy.array(array_like_1)
na_2 = numpy.array(array_like_2)

print(+na_1)
print(-na_1)
print(-na_2)
print(~na_2)
[  1  10 100]
[  -1  -10 -100]
[  2  20 100]
[ 1 19 99]