データ分析の迷宮を脱出!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)

配列が「縦にいくつ、横にいくつ要素を持っているか」というサイズのことです。

(3, 4) という Shape があれば、それは「3行(縦に3つ) \times 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次元配列はそのレポート用紙を何枚も重ねた「束」です。

ここで、それぞれの軸がどこを指しているか整理しましょう。

  1. axis = 0(奥行き・ページ方向):何枚目の紙か。
  2. axis = 1(行方向):その紙の「縦」にどこまで行くか。
  3. axis = 2(列方向):その紙の「横」にどこまで行くか。

例えば、カラー画像データは「縦 \times\times 色(赤・緑・青)」の3次元でできています。この場合、axis = 2 は「何色目のデータか」という色のチャンネルを指していることになります。

皆さんは、3枚重ねのパンケーキを想像したとき、上から串を刺すのが axis = 0、横からナイフを入れるのが axis = 1 や 2 だと直感的に分かりますか?

np.concatenate で配列を合体させる魔法

データを扱っていると、別々に作った配列を一つにまとめたい場面がよくあります。そのときに使うのが np.concatenate です。この関数を使う際にも、どの軸に沿ってくっつけるか(axis)の指定が運命を分けます。

2次元の配列 A B を結合する場合を考えてみましょう。

axis = 0 で結合(縦に積む)

A の下に B を置くイメージです。レポート用紙の下に新しい用紙をテープで貼って、長い紙にするようなものですね。

axis = 1 で結合(横に並べる)

A の右側に B を置くイメージです。2枚の紙を横に並べて、ワイドな表を作る感覚です。

結合のメリットとデメリット

項目内容
メリット散らばったデータを一つの大きな塊として一括処理できるようになる。
デメリット結合する軸以外のサイズ(例えば縦に積むなら横幅)がピッタリ一致していないとエラーで止まってしまう。

実際のコードで3次元の結合を見てみよう

3次元配列(例えば 2 \times 2 \times 2 の立方体)を 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 \times 2 \times 4 になりました。これは「2枚の紙があり、それぞれの紙が横に2倍長く伸びた」状態を指します。一番深いところにある軸が伸びた、ということですね!

今後の学習の指針

3次元の感覚が掴めてきたら、ぜひ以下のステップに挑戦してください。

  1. 画像データの「赤」の成分だけを抜き出すために、axis = 2 を指定してスライスしてみる。
  2. 複数の画像を縦に並べる(axis = 0)のと、横に並べる(axis = 1)コードを書いてみる。
  3. np.stack という、新しい軸を作って積み上げる関数と np.concatenate の違いを調べる。

多次元の操作に慣れると、機械学習で扱う複雑なデータも自由自在に操れるようになりますよ。

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。