np.sum()
と np.add.reduce()
を比較してみる
NumPyには、配列の要素を合計するための関数として、よく使われる np.sum()
のほかに、 np.add.reduce()
という関数もあります。今回、この2つの関数の違いと使い分けについてどう違うのか?と疑問が浮かんだので記録に残そうと思います!
np.sum()
とは?
np.sum()
は、配列の要素を合計するための関数です。シンプルな加算だけでなく、特定の軸に沿った合計や、部分的な合計を簡単に行えるのが特徴
# 基本的な使い方
import numpy as np
# 1次元配列の合計
arr = np.array([1, 2, 3, 4])
print(np.sum(arr)) # 出力: 10
# 2次元配列の合計(軸を指定)
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(np.sum(arr2, axis=0)) # 出力: [5 7 9]
print(np.sum(arr2, axis=1)) # 出力: [ 6 15]
np.add.reduce()
とは?
np.sum()
は、軸(axis)を指定して部分的な合計を計算できるなど、多次元配列に対して柔軟に操作ができる一方、 np.add.reduce()
は、単純な加算しかできないため、柔軟性では np.sum()
に劣るらしい...
# 基本的な使い方
# 2次元配列の軸を指定した合計
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(np.sum(arr, axis=0)) # 出力: [5 7 9]
処理速度について
np.add.reduce()
は、内部的に ufunc
の reduce
メソッドを直接使用するため、特に小さな配列や特定の状況で np.sum()
よりも高速に動作することがあります。実際どのくらい速いの...?とふと疑問が浮かんだので、実際の差分を見てみました!
import numpy as np
import timeit
arr = np.arange(100)
# np.add.reduce の実行時間
reduce_time = timeit.timeit(lambda: np.add.reduce(arr), number=100000)
# np.sum の実行時間
sum_time = timeit.timeit(lambda: np.sum(arr), number=100000)
print(f"np.add.reduce: {reduce_time:.5f}秒")
print(f"np.sum: {sum_time:.5f}秒")
結果としてはこんな感じの値が取得できました。
np.add.reduce: 0.11344395799096674秒
np.sum: 0.18717783299507573秒
出力結果として、 np.add.reduce
の方がわずかに速いことがわかりました!
使い分けのポイント
np.add.reduce()
使用した方が早いことを出力結果含めて実感できたわけですが、となると基本的にreduceを使うべきなのか、使用パターンが決まっているのか気になってしまったので、使用用途について着目してみました。
np.add.reduce()
- 速度が重要な場合:特に小規模な配列や、数値計算での合計を素早く行いたい場面では
np.add.reduce()
を使うことで、わずかながら速度向上が見込める - シンプルな合計を行いたい場合:多次元配列で特定の軸を指定せずに合計を行う場合など、柔軟性が不要な状況で有効となる
np.sum()
- 軸を指定して合計を行いたい場合:多次元配列の処理や、データフレームのような構造的なデータの一部を合計する際には
np.sum()
が適しテイル - 可読性が重要な場合:
np.sum()
はNumPyの合計関数として広く知られており、コードの可読性も高くなる
まとめ
np.sum()
と np.add.reduce()
は、どちらも配列の合計を計算するための便利な関数ですが、それぞれに適した使い方があります。柔軟性や可読性を重視する場合は np.sum()
を、速度やシンプルな合計処理を求める場合は np.add.reduce()
を選ぶのが良い。
おわりに
Pythonに触れ始めてどう使い分ければいいの?とちょっとした疑問から調べるに当たりました。フロント実装している時も何やら似たような処理を行なってくれるメソッドは溢れるほどあるわけで、いつも悩むんですよね〜•••。
少しずつ頭にインプットしながら覚えていけば実務の時のタイパも良くと実感しているので、これからも初歩的な疑問解決についてはドキュメントにも残して引き出したくさん作ろうと思います💐