目次
NumPy
前回、PythonのNumPyでリスト内のゼロではない要素の数を数える方法(np.count_nonzero)を紹介しました。
【NumPy】ndarray内のゼロではない要素の数を数える方法(np.count_nonzero)[Python]
NumPy 前回、PythonのNumPyでリスト内の隣り合う要素の差分を計算する方法(np.diff)を紹介しました。 今回はNumPyでndarray内のゼロではない要素の数を数える方法(np…
今回は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)を紹介します。
【NumPy】累積和を計算する方法(np.cumsum)と累積積を計算する方法(np.cumprod)[Python]
NumPy 前回、PythonのNumPyでbool値のリスト内のTrueの数を数える方法を紹介しました。 今回はNumPyで累積和を計算する方法(np.cumsum)と累積積を計算する方法を紹介…
ではでは今回はこんな感じで。
コメント