【Python】bool型の値に対するNumpyの挙動を調べる
概要
Numpyは数値型の値に対して豊富なメソッドを持っていますが、bool型の値に対する挙動がどうなのかはあまり理解していなかったため試してみました。
検証環境
- Python 3.8.10
from platform import python_version
print(python_version())
------
3.8.10
- numpy 1.21.4
from platform import python_version
print(python_version())
------
1.21.4
検証用リスト
TrueとFalseで構成されたリスト、TrueとFalseと1,0で構成されたリストを定義します。
import numpy as np
bl_lst = np.array([True, True, False, True, False])
bl_int_lst = np.array([True, 1, False, 1, 0])
格納した際の挙動
まず、格納直後に値がどうなるかを確認します。bool型のみの場合はbool型のままですが、boolと整数が混在している場合はTrue : 1、False : 0と自動的に置換されます。この前提条件を理解するとその後の挙動もすんなりと腹落ちしました。
print("bool list: {}".format(bl_lst))
print("bool&int_list: {}".format(bl_int_lst))
-----
bool list: [ True True False True False]
bool&int_list: [1 1 0 1 0]
平均(mean)の挙動
Trueが1、Falseが0とみなされて平均値が計算されます。
print("mean of bool: {}".format(np.mean(bl_lst)))
print("mean of bool&int: {}".format(np.mean(bl_int_lst)))
-----
mean of bool: 0.6
mean of bool&int: 0.6
中央値(median)の挙動
medianについてもmeanと同様にTrue : 1 、False : 0の換算式で計算されます。
print("median of bool: {}".format(np.median(bl_lst)))
print("median of bool&int: {}".format(np.median(bl_int_lst)))
-----
median of bool: 1.0
median of bool&int: 1.0
分散(var)の挙動
varもTrue : 1 、False : 0の換算式になります。
print("var of bool: {}".format(np.var(bl_lst)))
print("var of bool&int: {}".format(np.var(bl_int_lst)))
-----
var of bool: 0.24000000000000005
var of bool&int: 0.24000000000000005
合計(sum)の挙動
sumの場合も同様にTrue : 1、False : 0で計算されます。
print("sum of bool: {}".format(np.sum(bl_lst)))
print("sum of bool&int: {}".format(np.sum(bl_int_lst)))
-----
sum of bool: 3
sum of bool&int: 3
最大(max)の挙動
bool型のみのリストの場合はTrueがmaxとして抽出されます。bool型とintが混在したリストはすべてintに置換されているため、maxとしては1が選ばれます。
print("max of bool: {}".format(np.max(bl_lst)))
print("max of bool&int: {}".format(np.max(bl_int_lst)))
-----
max of bool: True
max of bool&int: 1
最小(min)の挙動
bool型のみのリストの場合はFalseがminとして抽出されます。bool型とintが混在したリストはすべてintに置換されているため、minとしては0が選ばれます。
print("min of bool: {}".format(np.min(bl_lst)))
print("min of bool&int: {}".format(np.min(bl_int_lst)))
-----
min of bool: False
min of bool&int: 0
ソート(sort)の挙動
sortのデフォルトは降順ソートになりますが、bool型のみの場合はFalse→Trueの順に並びます。bool型とint型の混在についてはTrue : 1、False:0に置換されているので0→1の順に並びます。
print("sort of bool: {}".format(np.sort(bl_lst)))
print("sort of bool&int: {}".format(np.sort(bl_int_lst)))
-----
sort of bool: [False False True True True]
sort of bool&int: [0 0 1 1 1]
まとめ
True、Falseの演算の挙動については忘れがちですが、基本的にTrue : 1 、False : 0と考えておけば問題ないです。