データ分析の迷宮を脱出!numpyのaxis(軸)を完璧に攻略するコツ
こんにちは。ゆうせいです。
プログラミングでデータ分析を始めると、必ずと言っていいほどぶつかる壁があります。それが、Pythonのライブラリ「numpy」で使われる「axis(軸)」という概念です。
「axis = 0 って縦だっけ? 横だっけ?」と混乱して、適当に数字を入れて試行錯誤していませんか? 実は、ある一つのイメージを持つだけで、もう二度と迷わなくなるんです。今回はその秘密を解き明かしましょう!
axisとは「計算をまとめる方向」のこと
そもそも axis(アクシス)とは、日本語で「軸」を意味します。多次元配列という「数字が詰まった箱」に対して、「どの方向に沿って計算するか」を指定するための道しるべです。
一番よく使う 2次元配列(表形式のデータ)を例に考えてみましょう。
axis = 0(行方向への集計)
axis = 0 を指定すると、numpyは「縦方向」に動いて計算します。
例えば、テストの結果が「行(縦)に生徒」「列(横)に教科」で並んでいる表を想像してください。
各教科の平均点を知りたいとき、皆さんはどう計算しますか? 上から下へ、生徒全員の点数を足していきますよね。この「上から下へ突き抜ける動き」が axis = 0 です。
axis = 1(列方向への集計)
一方で axis = 1 を指定すると、numpyは「横方向」に動きます。
先ほどのテストの例で言えば、一人の生徒の「合計点」を出したいときです。左から右へ、国語、算数、理科……と足していきますよね。この「左から右へ突き抜ける動き」が axis = 1 です。
専門用語を高校生レベルで解説!
ここで、numpyを扱う上で避けて通れない2つの言葉を、身近な例えで解説します。
1. 多次元配列(Multi-dimensional Array)
多次元配列とは、数字を整理整頓して入れる「仕切りのある箱」のことです。
1次元は「一列に並んだ行列(レジの列)」、2次元は「エクセルのシート(表)」、3次元は「それが何枚も重なったバインダー」のようなイメージです。
2. 形状(Shape)
配列が「縦にいくつ、横にいくつ要素を持っているか」というサイズのことです。
という Shape があれば、それは「3行(縦に3つ)
4列(横に4つ)」の表であることを意味します。
axisを操作するメリットとデメリット
この仕組みを理解すると、データ処理のスピードが劇的に変わります。
| 項目 | 内容 |
| メリット | 数万行あるデータでも、たった一行のコードで一瞬にして合計や平均を算出できる。 |
| デメリット | 指定を間違えると、全く意図しない方向の集計結果が出てしまい、バグの原因になる。 |
実際のコードで動きを見てみよう
実際にどう書くのか、簡単な例を見てみましょう。3行2列の配列で合計を出してみます。
import numpy as np
data = np.array([[1, 2], [3, 4], [5, 6]])
# 縦方向に足す(各列の合計)
print(np.sum(data, axis = 0))
# 出力結果: [9 12]
# 横方向に足す(各行の合計)
print(np.sum(data, axis = 1))
# 出力結果: [3 7 11]
コードを書くときは、「どの軸を潰して(まとめて)結果を出したいか」を考えるとスムーズですよ!
3次元の壁を突破せよ!NumPyのaxis=2と配列結合の極意
2次元の表形式まではイメージできても、3次元になった途端に「axis = 2ってどこ?」と頭がフリーズしてしまう方は少なくありません。でも大丈夫。3次元配列は、単なる「紙の束」だと考えれば一気に視界が開けますよ!
今回は、3次元の構造から、配列をガッチャンコとつなげる結合のコツまで、一気にマスターしていきましょう。
3次元配列は「パラパラ漫画」でイメージする
2次元配列が「1枚のレポート用紙」なら、3次元配列はそのレポート用紙を何枚も重ねた「束」です。
ここで、それぞれの軸がどこを指しているか整理しましょう。
- axis = 0(奥行き・ページ方向):何枚目の紙か。
- axis = 1(行方向):その紙の「縦」にどこまで行くか。
- axis = 2(列方向):その紙の「横」にどこまで行くか。
例えば、カラー画像データは「縦 横
色(赤・緑・青)」の3次元でできています。この場合、axis = 2 は「何色目のデータか」という色のチャンネルを指していることになります。
皆さんは、3枚重ねのパンケーキを想像したとき、上から串を刺すのが axis = 0、横からナイフを入れるのが axis = 1 や 2 だと直感的に分かりますか?
np.concatenate で配列を合体させる魔法
データを扱っていると、別々に作った配列を一つにまとめたい場面がよくあります。そのときに使うのが np.concatenate です。この関数を使う際にも、どの軸に沿ってくっつけるか(axis)の指定が運命を分けます。
2次元の配列 と
を結合する場合を考えてみましょう。
axis = 0 で結合(縦に積む)
の下に
を置くイメージです。レポート用紙の下に新しい用紙をテープで貼って、長い紙にするようなものですね。
axis = 1 で結合(横に並べる)
の右側に
を置くイメージです。2枚の紙を横に並べて、ワイドな表を作る感覚です。
結合のメリットとデメリット
| 項目 | 内容 |
| メリット | 散らばったデータを一つの大きな塊として一括処理できるようになる。 |
| デメリット | 結合する軸以外のサイズ(例えば縦に積むなら横幅)がピッタリ一致していないとエラーで止まってしまう。 |
実際のコードで3次元の結合を見てみよう
3次元配列(例えば の立方体)を axis = 2 で結合するとどうなるでしょうか?
import numpy as np
# 2x2x2の配列を作成
a = np.ones((2, 2, 2))
b = np.zeros((2, 2, 2))
# axis=2(一番内側の軸)で結合
result = np.concatenate([a, b], axis = 2)
print(result.shape)
# 出力結果: (2, 2, 4)
この結果、形状(Shape)は になりました。これは「2枚の紙があり、それぞれの紙が横に2倍長く伸びた」状態を指します。一番深いところにある軸が伸びた、ということですね!
今後の学習の指針
3次元の感覚が掴めてきたら、ぜひ以下のステップに挑戦してください。
- 画像データの「赤」の成分だけを抜き出すために、axis = 2 を指定してスライスしてみる。
- 複数の画像を縦に並べる(axis = 0)のと、横に並べる(axis = 1)コードを書いてみる。
np.stackという、新しい軸を作って積み上げる関数とnp.concatenateの違いを調べる。
多次元の操作に慣れると、機械学習で扱う複雑なデータも自由自在に操れるようになりますよ。