集計演算
1. 学習内容
- ❶ 基本的な集計関数:sum、mean、std、var、min、max
- ❷ 軸ベースの集計:特定の次元に沿って集計を行う
- ❸ NaNに対応した関数:nanmean、nansum、nanstd
- ❹ 累積演算:cumsum、cumprod
- ❺ 集計とPythonの組み込み関数
2. ストーリー
アリスは、1,000万件のセンサー測定値の平均、最大値、標準偏差を計算する必要があります。Pythonでは、3つのループを記述することになり、15秒かかります。 NumPyでは:data.mean()、data.max()、data.std() — 合計0.05秒。「NumPyでの集計は単に速いだけでなく、まったく異なるパラダイムなのです。 関数を1回呼び出すだけで、C言語レベルの実行が行われ、Pythonのループは一切必要ありません。」
3. 主要な概念
(1) 基本的な集計
PYTHON
import numpy as np
a = np.array([3, 7, 1, 9, 5])
print(a.sum()) # 25
print(a.mean()) # 5.0
print(a.std()) # 2.828
print(a.var()) # 8.0
print(a.min()) # 1
print(a.max()) # 9
print(a.argmin()) # 2 (index of min)
print(a.argmax()) # 3 (index of max)
print(a.ptp()) # 8 (peak to peak: max - min)
TEXT
> Output: Run NumPy 2.x in your local Python environment to see the ndarray output. The Piston server does not have NumPy pre-installed — install it locally (`pip install numpy`) and compare. Actual values may vary by NumPy version and random seed.
⚠️ 注意: 以下のコードは、ローカルの Python 環境で実行する必要があります。
(2) 軸ベースの集計
PYTHON
import numpy as np
a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# Sum along axis 0 (column-wise)
print(a.sum(axis=0)) # [12 15 18 21]
# Sum along axis 1 (row-wise)
print(a.sum(axis=1)) # [6 22 38]
# Global sum
print(a.sum()) # 66
TEXT
> Output: Run NumPy 2.x in your local Python environment to see the ndarray output. The Piston server does not have NumPy pre-installed — install it locally (`pip install numpy`) and compare. Actual values may vary by NumPy version and random seed.
⚠️ 注意: 以下のコードは、ローカルの Python 環境で実行する必要があります。
(3) NaN に対応した関数
実世界データには、NaN値が含まれていることがよくあります。標準的な集計処理では、NaN値がそのまま伝播されます:
PYTHON
import numpy as np
a = np.array([1.0, 2.0, np.nan, 4.0])
print(a.mean()) # nan
print(np.nanmean(a)) # 2.333
print(np.nansum(a)) # 7.0
print(np.nanstd(a)) # 1.247
print(np.nanmin(a)) # 1.0
print(np.nanmax(a)) # 4.0
TEXT
> Output: Run NumPy 2.x in your local Python environment to see the ndarray output. The Piston server does not have NumPy pre-installed — install it locally (`pip install numpy`) and compare. Actual values may vary by NumPy version and random seed.
⚠️ 注意: 以下のコードは、ローカルの Python 環境で実行する必要があります。
(4) 累積演算
PYTHON
import numpy as np
a = np.array([1, 2, 3, 4, 5])
print(np.cumsum(a)) # [1 3 6 10 15]
print(np.cumprod(a)) # [1 2 6 24 120]
(1) ▶ サンプル
TEXT
> Output: Run NumPy 2.x in your local Python environment to see the ndarray output. The Piston server does not have NumPy pre-installed — install it locally (`pip install numpy`) and compare. Actual values may vary by NumPy version and random seed.
: 2Dでの軸の集約 (難易度 ⭐⭐)
PYTHON
import numpy as np
a = np.arange(12).reshape(3, 4)
print("axis=0 (column-wise):")
print(f" sum: {a.sum(axis=0)}")
print(f" mean: {a.mean(axis=0)}")
print(f" max: {a.max(axis=0)}")
print("axis=1 (row-wise):")
print(f" sum: {a.sum(axis=1)}")
print(f" mean: {a.mean(axis=1)}")
print(f" max: {a.max(axis=1)}")
(2) ▶ サンプル:NaN対応の集計処理(難易度 ⭐⭐)
PYTHON
import numpy as np
data = np.array([1.0, 2.0, np.nan, 4.0, np.nan, 6.0])
print("Standard mean:", data.mean())
print("nanmean:", np.nanmean(data))
print("nansum:", np.nansum(data))
print("nanstd:", np.nanstd(data))
print("nanmin:", np.nanmin(data))
print("nanmax:", np.nanmax(data))
# Count non-NaN values
print("Valid count:", np.sum(~np.isnan(data)))
出力:
TEXT標準平均:nan 平均点:3.25 ナンスム:13.0 nanstd: 1.9202864369672785 nanmin: 1.0 nanmax: 6.0 有効な件数:4
(3) ▶ サンプル:累積演算(難易度 ⭐)
PYTHON
import numpy as np
# Running total
sales = np.array([10, 15, 7, 20, 13])
cumulative = np.cumsum(sales)
print("Daily sales:", sales)
print("Cumulative:", cumulative)
# Cumulative product
factors = np.array([1.1, 1.05, 0.98, 1.02])
growth = np.cumprod(factors)
print("Growth factors:", growth)
# 2D cumulative sum
a = np.arange(12).reshape(3, 4)
print("Row-wise cumsum:\n", np.cumsum(a, axis=1))
出力:
TEXT1日あたりの売上:[10 15 7 20 13] 累計:[10 25 32 52 65] 成長因子:[1.1 1.155 1.1319 1.154538] 行ごとの累積和: [[ 0 1 3 6] [ 4 9 15 22] [ 8 17 27 38]]
❓ よくある質問
Q a.sum() と np.sum(a) の違いは何ですか?
A 違いはありません。これらは同じメソッドです。
a.sum() は ndarray オブジェクトのメソッドであり、np.sum(a) はその関数形式です。文脈に応じて、読みやすい方を使用してください。Q 集計処理においてNaN値をどのように扱うべきですか?
A
np.nanmean()、np.nansum()、np.nanstd() などを使用してください。これらの関数はNaN値を自動的にスキップします。 標準の mean()、sum() は NaN を伝播します。Q keepdims とは何ですか?
A
keepdims=True は、次元削減後の次元をサイズ 1 として保持するため、ブロードキャストが容易になります。例えば、a.sum(axis=1, keepdims=True) は (3,) ではなく (3, 1) の形状を返します。📖 まとめ
- 基本的な集計関数:sum、mean、std、var、min、max、argmin、argmax、ptp
- 「軸」パラメータは、どの次元を縮小するかを制御します。
keepdimsは次元を維持します - NaN に対応した関数:nanmean、nansum、nanstd、nanmin、nanmax
- 累積:累積和(cumsum)、累積積(cumprod)による累積合計および累積積
📝 練習問題
-
初心者(難易度 ⭐):0~100のランダムな整数からなる4×4の配列を作成してください。配列全体の合計、平均、最小値、最大値、標準偏差を計算してください。次に、各軸に沿って同じ統計量を計算してください。
-
中級(難易度 ⭐⭐):NaN 値を含む配列を作成してください。NaN 対応関数を使用する場合と使用しない場合で、平均値を計算してください。その違いを説明してください。
-
上級(難易度 ⭐⭐⭐):10,000行5列のランダムデータ配列を生成してください。 各列について、軸ベースの平均と標準偏差を用いてzスコア(標準化)を計算する。各列の平均が≈0、標準偏差が≈1であることを確認する。