NumPyの強力な集計術:axisとkeepdimsを使いこなす!
NumPyのndarrayは、多次元データを効率的に扱うための強力なツールです。データ分析や機械学習のタスクでは、配列の要素を集計(合計、平均、最大値など)することが頻繁にあります。この集計処理をより柔軟に行うために不可欠なのが、引数**axisとkeepdims**です。
この記事では、NumPyの集計関数におけるaxisとkeepdimsの役割と使い方を、具体的なコード例を交えて詳しく解説します。
NumPy集計関数の基本とaxisの役割
NumPyの集計関数(np.sum(), np.mean(), np.max(), np.min()など)は、デフォルトでは配列全体の要素を対象に集計を行います。しかし、特定の次元(軸)に沿って集計したい場合にaxis引数が非常に役立ちます。
axisとは?
NumPy配列の**axis**(軸)は、配列の次元を指します。
たとえば、2次元配列(行列)の場合:
-
axis=0: 行方向に沿って操作を行います。つまり、各列に対して計算が行われます。 -
axis=1: 列方向に沿って操作を行います。つまり、各行に対して計算が行われます。
次元が増えるにつれて、axis=2, axis=3… と増えていきます。
axisを使った集計例
簡単な2次元配列を使ってaxisの効果を見てみましょう。
import numpy as np
# 2次元配列(3行4列)
arr = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
])
print("元の配列:\n", arr)
# axisを指定しない場合(配列全体の合計)
print(f"\n全体の合計: {np.sum(arr)}")
# axis=0 で列方向(縦方向)に合計
# 各列の要素を合計し、結果は1行の配列になる
print(f"axis=0 で合計:\n {np.sum(arr, axis=0)}")
# 出力: [15 18 21 24] (1+5+9=15, 2+6+10=18, ...)
# axis=1 で行方向(横方向)に合計
# 各行の要素を合計し、結果は1列の配列になる
print(f"axis=1 で合計:\n {np.sum(arr, axis=1)}")
# 出力: [10 26 42] (1+2+3+4=10, 5+6+7+8=26, ...)
このようにaxisを指定することで、集計結果の形状が大きく変わることがわかります。指定したaxisは集計によって「消滅」し、その次元が結果の配列から取り除かれます。
keepdimsの役割と使い方:次元を保持する
先ほどの例で見たように、axisを指定して集計を行うと、指定した軸が結果の配列から取り除かれ、次元が減ってしまいます。しかし、元の配列と同じ次元数を維持したい場合があります。そこで登場するのが引数**keepdims**です。
keepdimsとは?
**keepdims=True**を設定すると、集計で取り除かれた軸が、長さ1の次元として結果の配列に維持されます。これにより、元の配列とのブロードキャスト操作が容易になるなど、形状の一貫性を保つことができます。デフォルトではFalseです。
keepdimsを使った集計例
先ほどのarrを使ってkeepdimsの効果を見てみましょう。
import numpy as np
arr = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
])
# axis=0 で合計し、keepdims=True
# 結果の形状が (1, 4) となり、元の (3, 4) と比較しやすい
sum_axis0_keepdims = np.sum(arr, axis=0, keepdims=True)
print(f"axis=0, keepdims=True で合計:\n {sum_axis0_keepdims}")
print(f"形状: {sum_axis0_keepdims.shape}")
# 出力: [[15 18 21 24]] (形状: (1, 4))
# axis=1 で合計し、keepdims=True
# 結果の形状が (3, 1) となり、元の (3, 4) と比較しやすい
sum_axis1_keepdims = np.sum(arr, axis=1, keepdims=True)
print(f"axis=1, keepdims=True で合計:\n {sum_axis1_keepdims}")
print(f"形状: {sum_axis1_keepdims.shape}")
# 出力: [[10], [26], [42]] (形状: (3, 1))
keepdimsのメリット
keepdims=Trueを使用する主なメリットは以下の通りです。
-
ブロードキャストの容易さ: 集計結果の形状が元の配列と互換性を持つため、計算結果を元の配列にブロードキャストして操作する際に便利です(例: 各要素から列の平均を引くなど)。
Python# 各要素から列の平均を引く例 mean_cols = np.mean(arr, axis=0, keepdims=True) normalized_arr = arr - mean_cols print(f"\n各列の平均を引いた配列:\n {normalized_arr}") -
コードの可読性: 形状の変化が予測しやすくなり、コードの理解が容易になります。
-
多次元配列での一貫性: 3次元以上の配列でも、
keepdimsを使うことで常に同じ次元数を維持できるため、複雑な処理のデバッグがしやすくなります。
まとめ
NumPyのaxisとkeepdimsは、配列の集計処理を柔軟かつ強力に行うための非常に重要な引数です。
-
axis: どの次元に沿って集計を行うかを指定します。指定した軸は結果の配列から取り除かれます。 -
keepdims=True: 集計によって取り除かれる軸を、長さ1の次元として結果の配列に保持します。これにより、元の配列との形状の一貫性を保ちやすくなります。
これらの引数を使いこなすことで、NumPyでのデータ操作が格段に効率的かつ分かりやすくなります。データ分析や機械学習のコードを書く際には、ぜひ積極的に活用してみてください。
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座

