1. 要素ごとの演算(おさらい+発展)
レッスン1で学んだ通り、NumPyの演算は 要素ごとに自動適用されます。 ここではそれをもう少し広げて、配列同士の演算と 数学関数を見ていきます。
⚠ shape が違うとエラー(または自動拡張): 配列同士の演算は基本的に shape が同じであることが必要です。 ただし、ある条件を満たすと NumPy が自動で形を合わせる「ブロードキャスト」が発動します(レッスン9で詳しく学習)。 今のところは「同じshape同士なら要素ごと」と覚えておけばOKです。
NumPyには数学関数も豊富に用意されています。配列まるごとに対して適用できます。
🤖 AI用語メモ — 「log・exp はなぜ AI で頻出?」
AIの損失関数(モデルの予測がどれだけ外れているかを測る関数)には、log が頻繁に登場します(例:交差エントロピー損失)。
また、確率を出力する Softmax 関数 の中身は exp です。
「数学関数 = AI実装の部品」と覚えておきましょう。詳細はAI資格コースで扱います。
2. 統計関数
データの傾向をひと目で掴むための統計関数が豊富に用意されています。 最頻出のものを表にまとめました。
📘 表記について:
arr.xxx() は NumPy配列のメソッド(配列に「.」を付けて呼び出す形式)、
np.xxx(arr) は NumPyの関数(引数に配列を渡す形式)です。
両方が用意されている計算は、どちらで書いても結果は同じです。
| 書き方(メソッド形式 / 関数形式) | 意味 | 注意点 |
|---|---|---|
arr.mean() / np.mean(arr) | 平均 | 外れ値に弱い |
np.median(arr) | 中央値 | 外れ値に強い |
arr.std() / np.std(arr) | 標準偏差 | 分布のばらつき |
arr.var() / np.var(arr) | 分散 | std の2乗 |
arr.min() / arr.max() | 最小・最大 | 外れ値で大きく変わる |
arr.sum() / arr.prod() | 合計・総積 | — |
np.percentile(arr, p) | pパーセンタイル | 分布の特定位置の値 |
💡 平均 vs 中央値 — どちらを使うべきか: 外れ値が含まれる可能性のあるデータでは中央値の方が安全です。 例えば年収データで「年収1億円の人が1人混ざる」と平均が大きく引っ張られますが、中央値はほとんど変わりません。 医療データでも、検査値の入力ミスや異常値がある場合は中央値を使う場面が多いです。
💡 関数の書き方は2通り:
arr.mean() と np.mean(arr) は同じ結果になります。
ほとんどの統計関数はどちらでも書けるので、好みで選んでOKです(一般にメソッド形式 arr.mean() の方が短く書けます)。
ただし np.median() や np.percentile() はメソッド形式が用意されていないので、np. 形式で書きます。
3. 累積系(cumsum / cumprod)
時系列のように「順番に積み上げていく」処理には、cumsum(累積和)と
cumprod(累積積)を使います。
元の配列と同じ長さの「途中経過」配列を返してくれます。
🩺 医療AI文脈:
時系列の医療データで cumsum が活躍する例:
- 投薬量の累積(薬剤の総投与量モニタリング)
- 水分摂取量の累積(バランス管理)
- 歩数の累積(リハビリ進捗)
- 異常イベントの累積回数(リスク評価)
4. 練習問題
心拍数の統計を求めよう
心拍数データ hr = np.array([72, 80, 95, 68, 110, 85, 92, 78, 88, 105]) について、
平均・中央値・標準偏差・最大・最小を表示してください。
ヒントを見る(答え+解説)
import numpy as np
hr = np.array([72, 80, 95, 68, 110, 85, 92, 78, 88, 105])
# 平均・中央値・標準偏差・最大・最小を表示してください
print("平均: ", hr.mean()) # 87.3
print("中央値: ", np.median(hr)) # 86.5
print("標準偏差:", hr.std().round(2)) # 12.66
print("最大: ", hr.max()) # 110
print("最小: ", hr.min()) # 68
mean・std・min・max はメソッド形式(arr.mean())でも関数形式(np.mean(arr))でも書けます。median はメソッド形式がないので np.median(arr) で書きます。
投薬前後の血圧差を計算しよう
5人の患者の投薬前 before = np.array([155, 142, 168, 138, 175]) と
投薬後 after = np.array([135, 130, 145, 128, 158]) の血圧から、
各患者の降圧量と 平均降圧量を計算してください。
ヒントを見る(答え+解説)
import numpy as np
before = np.array([155, 142, 168, 138, 175])
after = np.array([135, 130, 145, 128, 158])
# 各患者の降圧量を計算してください
delta = before - after
# 平均降圧量を表示してください
print("降圧量: ", delta) # [20 12 23 10 17]
print("平均降圧量:", delta.mean()) # 16.4
配列同士の引き算は要素ごとに行われます。before - after の1行だけで、5人分の降圧量がまとめて計算されます。Pythonの for ループは不要です。
累積歩数を計算しよう
ある患者の1週間の1日あたり歩数 steps = np.array([3500, 4200, 2800, 5100, 4800, 6200, 3900]) から、
各日終了時点での累積歩数を cumsum で計算してください。
ヒントを見る(答え+解説)
import numpy as np
steps = np.array([3500, 4200, 2800, 5100, 4800, 6200, 3900])
# 累積歩数を計算してください
cumulative = np.cumsum(steps)
print("毎日の歩数:", steps)
print("累積歩数: ", cumulative)
# → [ 3500 7700 10500 15600 20400 26600 30500]
print("1週間合計:", cumulative[-1]) # 30500
np.cumsum は「先頭から各位置までの和」を返します。最後の値は配列全体の合計と同じになるので、cumulative[-1] == steps.sum() となります。リハビリの進捗管理や、時間経過を伴う集計で頻出のパターンです。
5. まとめ
このレッスンのポイント
- 配列同士の演算は 要素ごとに自動適用(shape が同じ場合)
- 数学関数(
sqrt・exp・log・abs)も配列まるごとに適用可 - 統計関数:
mean・median・std・min/max・sum・percentile - 外れ値があるデータでは中央値(
median)の方が安全 cumsum・cumprod:時系列の累積処理に便利- 次のレッスンでは「2次元配列でこれらの統計を 軸別に 計算する」方法を学ぶ
自由に試してみましょう:
完了するとコース一覧に進捗が記録されます