Python | ファイル・OS 操作:NumPy の sum / mean

Python Python
スポンサーリンク

概要(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.]
Python

axis=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)  # 行方向に明快なブロードキャスト
Python

keepdims=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) に整えて安全に行方向で引く
Python

keepdims や [:, 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 で形を保って安全に次の計算へ」です。列・行・全体を自在に切り替え、センタリングや標準化へ直結できる型を身につければ、ループなしで素早く正確な集計が書けます。欠損と形崩れへの備えを整えることで、初心者でも実務品質の数値処理を安定して組めるようになります。

タイトルとURLをコピーしました