ブール型の演算について
どの言語もそうですが、整数型や浮動小数点型の演算はだいたい同じですが、ブール型の演算は少しずつやり方が異なっているような気がします。
pythonでの扱い方について記録しておきます。
a = True
b = False
a and b
とすると
False
となります。
a+b
とすると
1
となり、
a+a
とすると
2
になります。
つまり、ブール型はTrueが1、Falseが0の値になっていると考えて構わないと思います。
それで、今度はnumpy.arrayでの扱いです。
aa = numpy.array( [ a, a, b] )
とすると
array([ True, True, False], dtype=bool)
となり、bool型として扱われていることがわかります。
で、今度は
aa and aa
とするとエラーになります。
実行した結果のエラーメッセージは下のようになっていました。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()
numpy.arrayは他の型ではそれぞれの要素に関して個別に演算するので、ブール型もそうかと思うとそうでもないようです。
で、今度は
aa = numpy.array( [True, True, False], dtype=bool)
bb = numpy.array( [False, True, False], dtype=bool)
aa + bb
aa * bb
とすると、それぞれ下のようになりました。
>>> aa+bb
array([ True, True, False], dtype=bool)
>>> aa*bb
array([False, True, False], dtype=bool)
つまり、要素個別に演算する場合は+と*でandとorの代用する必要があるということです。
andとor,notは単独のTrue, Falseといったブール値にしか使えません。
notで実現していた、反転をさせる場合はどうするかというと、
~aa
とします。
結果は
array([False, False, True], dtype=bool)
となります。
ブールのarrayは結構有用です。
たとえば、
x = numpy.random.randint( 0, 10, 12 )
c = x>5
print x[c]
というように、条件にあったものだけ抽出する際に使います。
cは
array([ True, False, True, False, True, False, True, True, True,
False, False, False], dtype=bool)
といった風にbool型のarrayになっています。
0 件のコメント:
コメントを投稿