集計演算

1. 学習内容



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))

出力:

TEXT
1日あたりの売上:[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) の形状を返します。

📖 まとめ



📝 練習問題

  1. 初心者(難易度 ⭐):0~100のランダムな整数からなる4×4の配列を作成してください。配列全体の合計、平均、最小値、最大値、標準偏差を計算してください。次に、各軸に沿って同じ統計量を計算してください。

  2. 中級(難易度 ⭐⭐):NaN 値を含む配列を作成してください。NaN 対応関数を使用する場合と使用しない場合で、平均値を計算してください。その違いを説明してください。

  3. 上級(難易度 ⭐⭐⭐):10,000行5列のランダムデータ配列を生成してください。 各列について、軸ベースの平均と標準偏差を用いてzスコア(標準化)を計算する。各列の平均が≈0、標準偏差が≈1であることを確認する。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%