概要(sum / mean は「配列を一発で集計」するための核機能)
NumPy の np.sum と np.mean は、配列全体や行・列ごとに合計と平均を高速に計算する基本関数です。重要なのは「axis(どの方向に畳み込むか)」「欠損値 NaN の扱い(nan 系関数)」「精度管理(dtype の指定)」「keepdims(形を保ってブロードキャストを安定化)」の4点です。まずは“全体→列→行”を自在に切り替え、欠損や形崩れを回避する型を体に入れましょう。
基本の使い方(ここが重要)
全体の合計と平均
import numpy as np
a = np.array([1, 2, 3, 4])
print(np.sum(a)) # 10
print(np.mean(a)) # 2.5
Python引数の指定がなければ「全要素」を対象に集計します。Pythonのリストより速く、長い配列でも安定して計算できます。
行・列方向の集計(axis の意味)
import numpy as np
m = np.array([[1, 2, 3],
[4, 5, 6]])
print(np.sum(m, axis=0)) # 列方向(縦に畳む) → [5 7 9]
print(np.sum(m, axis=1)) # 行方向(横に畳む) → [6 15]
print(np.mean(m, axis=0)) # 列ごとの平均 → [2.5 3.5 4.5]
print(np.mean(m, axis=1)) # 行ごとの平均 → [2. 5.]
Pythonaxis=0 は「列ごと」、axis=1 は「行ごと」です。多次元でも“どの軸に沿って集計するか”を明確に意識します。
形を保って後続計算を安定化(keepdims)
import numpy as np
X = np.arange(6).reshape(2, 3) # [[0,1,2],[3,4,5]]
col_sum = np.sum(X, axis=0, keepdims=True) # shape=(1,3)
row_mean = np.mean(X, axis=1, keepdims=True) # shape=(2,1)
print(X - col_sum) # 列方向に明快なブロードキャスト
print(X - row_mean) # 行方向に明快なブロードキャスト
Pythonkeepdims=True は「集計した軸を長さ1で残す」ため、ブロードキャストの方向が明快になり、安全です。
欠損と精度の深掘り(NaN と dtype)
NaN を無視して集計(np.nansum / np.nanmean)
import numpy as np
x = np.array([1.0, np.nan, 3.0])
print(np.sum(x)) # → nan(通常は NaN が伝播)
print(np.nansum(x)) # → 4.0(NaN を無視)
print(np.nanmean(x)) # → 2.0(NaN を無視した平均)
Python欠損が混じるデータは「nan 系」を使うのが安全です。axis を併用すれば行・列方向でも使えます。
型と精度の制御(dtype)
import numpy as np
big = np.array([10**12, 10**12, 10**12], dtype=np.int64)
print(np.sum(big, dtype=np.int64)) # 3e12 を安全に扱える整数型
f = np.array([0.1, 0.2, 0.3], dtype=np.float32)
print(np.sum(f, dtype=np.float64)) # 浮動小数の誤差を抑えたい時に精度を上げる
Python集計時に dtype を指定すると、桁あふれや精度劣化を抑えられます。大きな整数や長い小数列で有効です。
実務の型(センタリング・標準化・重み付き平均)
列方向のセンタリングと標準化
import numpy as np
X = np.array([[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0],
[7.0, 8.0, 9.0]])
mu = np.mean(X, axis=0, keepdims=True)
sd = np.std(X, axis=0, keepdims=True)
Z = (X - mu) / sd
print(Z.round(2))
Python平均と標準偏差を列方向で求め、keepdims で形を保つと、後続のブロードキャストが明快になります。
行方向のセンタリング
import numpy as np
X = np.array([[10.0, 11.0, 12.0],
[20.0, 21.0, 22.0]])
row_mean = np.mean(X, axis=1, keepdims=True)
Xc = X - row_mean
print(Xc)
Python行ごとの基準差を見たい場合は、axis=1 の平均を引いて整えます。
重み付き平均(np.average)
import numpy as np
x = np.array([10.0, 20.0, 30.0])
w = np.array([1.0, 2.0, 1.0])
print(np.average(x, weights=w)) # → 22.5
Python重要度を反映した平均を出すなら np.average。axis 指定で行・列にも使えます。
よくある落とし穴(軸の取り違え・NaN の伝播・形崩れ)
axis の取り違えで意図しない結果
import numpy as np
X = np.arange(6).reshape(2, 3) # (2行,3列)
print(np.mean(X, axis=0)) # 列ごと → [1.5 2.5 3.5]
print(np.mean(X, axis=1)) # 行ごと → [1. 4.]
Python「列か行か」を常に確認します。shape と値を見て、意図通りか検証する癖が大切です。
NaN が紛れて平均が NaN になる
import numpy as np
x = np.array([1.0, np.nan, 3.0])
print(np.mean(x)) # → nan
print(np.nanmean(x)) # → 2.0
Python通常の mean は NaN を無視しません。前処理で欠損を補完・除去するか、nan 系を使いましょう。
集計後の形崩れでブロードキャスト方向を誤る
import numpy as np
X = np.arange(6).reshape(2, 3)
col_sum = np.sum(X, axis=0) # shape=(3,)
print(X - col_sum) # 列方向に引かれる(OK)
row_sum = np.sum(X, axis=1) # shape=(2,)
print(X - row_sum[:, None]) # (2,1) に整えて安全に行方向で引く
Pythonkeepdims や [:, None] で「合わせたい軸」に長さ1の次元を入れると、事故が減ります。
例題で身につける(定番から一歩先まで)
例題1:列ごとの合計・平均を出す
import numpy as np
M = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(np.sum(M, axis=0)) # 列合計 → [12 15 18]
print(np.mean(M, axis=0)) # 列平均 → [4. 5. 6.]
Python例題2:行ごとの平均を引いてセンタリング
import numpy as np
X = np.array([[10.0, 11.0, 12.0],
[20.0, 21.0, 22.0]])
row_mean = np.mean(X, axis=1, keepdims=True)
print(X - row_mean)
Python例題3:NaN を無視した列平均
import numpy as np
X = np.array([[1.0, np.nan, 3.0],
[4.0, 5.0, np.nan]])
print(np.nanmean(X, axis=0)) # → [2.5 5. 3. ]
Python例題4:重み付き平均で重要度を反映
import numpy as np
scores = np.array([70, 80, 90])
weights = np.array([1, 2, 3])
print(np.average(scores, weights=weights)) # → 83.333...
Pythonまとめ
np.sum / np.mean の核心は「axis で集計方向を明示」「NaN は nan 系で無視」「dtype で精度管理」「keepdims で形を保って安全に次の計算へ」です。列・行・全体を自在に切り替え、センタリングや標準化へ直結できる型を身につければ、ループなしで素早く正確な集計が書けます。欠損と形崩れへの備えを整えることで、初心者でも実務品質の数値処理を安定して組めるようになります。
