【NumPy】bool値のリストでTrueの数を数える方法[Python]

  • URLをコピーしました!
目次

NumPy

前回、PythonのNumPyでリスト内のゼロではない要素の数を数える方法(np.count_nonzero)を紹介しました。

今回はNumPydでbool値のリストでTrueの数を数える方法を紹介します。

まずはこんな感じでbool値のリストを作成してみました。

import numpy as np

a = np.array([[True, True, True],
              [True, True, False],
              [True, False, False],
              [False, False, False]])

print(a)

実行結果
[[ True  True  True]
 [ True  True False]
 [ True False False]
 [False False False]]

それでは始めていきましょう。

np.count_nonzero()を使う方法

まずは前回紹介した「np.count_nonzero(ndarray)」を使う方法です。

「axis」のオプション引数に軸方向を与えるとその軸方向におけるTrueの数を返してくれます。

import numpy as np

a = np.array([[True, True, True],
              [True, True, False],
              [True, False, False],
              [False, False, False]])

print(np.count_nonzero(a))
print(np.count_nonzero(a, axis=0))
print(np.count_nonzero(a, axis=1))

実行結果
6
[3 2 1]
[3 2 1 0]

sum関数を使う方法

またsum関数を使ってもTrueの数を取得することができます。

ただsum関数は「ndarray.sum()」と「np.sum(ndarray)」の2種類あります。

どちらも「axis」のオプション引数に軸方向を与えることでその軸方向におけるTrueの数を返してくれます。

import numpy as np

a = np.array([[True, True, True],
              [True, True, False],
              [True, False, False],
              [False, False, False]])

print(a.sum())
print(a.sum(axis=0))
print(a.sum(axis=1))

実行結果
6
[3 2 1]
[3 2 1 0]
import numpy as np

a = np.array([[True, True, True],
              [True, True, False],
              [True, False, False],
              [False, False, False]])

print(np.sum(a))
print(np.sum(a, axis=0))
print(np.sum(a, axis=1))

実行結果
6
[3 2 1]
[3 2 1 0]

この二つの違いですが、「ndarray.sum()」の場合はNumPyのndarrayであることが前提となっているため、通常のリストを渡してしまうとエラーになります。

import numpy as np

b = [[True, True, True],
     [True, True, False],
     [True, False, False],
     [False, False, False]]

print(b.sum())
print(b.sum(axis=0))
print(b.sum(axis=1))

実行結果
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[13], line 8
      1 import numpy as np
      3 b = [[True, True, True],
      4      [True, True, False],
      5      [True, False, False],
      6      [False, False, False]]
----> 8 print(b.sum())
      9 print(b.sum(axis=0))
     10 print(b.sum(axis=1))

AttributeError: 'list' object has no attribute 'sum'

一方「np.sum(リスト)」の場合はエラーになりません。

import numpy as np

b = [[True, True, True],
     [True, True, False],
     [True, False, False],
     [False, False, False]]

print(np.sum(b))
print(np.sum(b, axis=0))
print(np.sum(b, axis=1))

実行結果
6
[3 2 1]
[3 2 1 0]

それぞれの実行速度の違い

Jupyter notebookのマジックコマンド「%%timeit」を使って実行速度を比較してみました。

%%timeit

import numpy as np

a = np.array([[True, True, True],
              [True, True, False],
              [True, False, False],
              [False, False, False]])

print(np.count_nonzero(a))
print(np.count_nonzero(a, axis=0))
print(np.count_nonzero(a, axis=1))

実行結果
6
[3 2 1]
[3 2 1 0]

(中略)

128 µs ± 6.69 µs per loop (mean ± std. dev. of 7 runs, 
10,000 loops each)
%%timeit

import numpy as np

a = np.array([[True, True, True],
              [True, True, False],
              [True, False, False],
              [False, False, False]])

print(a.sum())
print(a.sum(axis=0))
print(a.sum(axis=1))

実行結果
6
[3 2 1]
[3 2 1 0]

(中略)

122 µs ± 6.13 µs per loop (mean ± std. dev. of 7 runs, 
10,000 loops each)
%%timeit

import numpy as np

a = np.array([[True, True, True],
              [True, True, False],
              [True, False, False],
              [False, False, False]])

print(np.sum(a))
print(np.sum(a, axis=0))
print(np.sum(a, axis=1))

実行結果
6
[3 2 1]
[3 2 1 0]

128 µs ± 7.57 µs per loop (mean ± std. dev. of 7 runs, 
10,000 loops each)

今回試した3つの方法では実行速度に特に大きな違いはありませんでした。

次回はNumPyで累積和を計算する方法(np.cumsum)と累積積を計算する方法(np.cumprod)を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次