NumPy中級①:配列操作の基本と応用|reshape・axis・スライスをマスター

はじめに

NumPyを使いこなすうえで避けて通れないのが、配列の操作です。特に reshape() による形状変換や、axis の概念、スライスによる部分抽出は、理解が曖昧なままだと後々で大きな壁になります。

これらの機能は、データ分析や機械学習の前処理、行列演算の効率化などに深く関わってくるため、NumPyの配列操作をマスターすることは、データサイエンスの基礎力を高めるうえで不可欠です。本記事では、図解やコード例を交えながら、配列操作の基本と応用を段階的に学べる構成にしています。


NumPy配列とは?基本の復習

ndarrayとリストの違い

Pythonには「リスト」と呼ばれる便利なデータ構造がありますが、NumPyで使う「ndarray(エヌディーアレイ)」とは根本的に性質が異なります。リストは異なるデータ型を含んでも問題ありませんが、ndarrayは同じ型の要素だけで構成され、数値演算に特化しています。そのため、計算速度が速く、行列計算や統計処理に非常に向いています。

import numpy as np
arr = np.array([1, 2, 3])
print(type(arr))  # <class 'numpy.ndarray'>

shapeとdtypeの確認

ndarrayの基本情報としてよく使うのが .shape.dtype です。shape は配列の次元サイズ(行数や列数など)をタプル形式で返し、dtype は配列内のデータ型を表します。これらを確認しておくことで、後の演算でのエラーを防ぎやすくなります。

print(arr.shape)  # (3,)
print(arr.dtype)  # int64(環境により異なる)

reshape()で配列の形を変える

reshapeの基本構文

reshape() メソッドは、配列の形を自由に変えることができる便利な機能です。例えば一次元の配列を行列形式に変えたいときなどに活用されます。ただし注意点として、元の配列とreshape後の配列の要素数は一致していなければなりません。

mat = np.array([1, 2, 3, 4, 5, 6])
mat2d = mat.reshape(2, 3)
print(mat2d)

次元を増やす・減らす操作

reshape() は、1次元のデータを2次元、3次元などに変形する際にも使えます。データを機械学習モデルに入力する際や、画像データなどを扱うときには、次元の追加・削除が必須になります。

row_vector = mat.reshape(1, 6)  # 行ベクトル
col_vector = mat.reshape(6, 1)  # 列ベクトル

このように、形を明示的に整えることで後続の処理を見通しやすくし、バグの原因を減らすことができます。

reshapeと-1の使い方

reshapeには便利な「-1」指定が可能です。これは「他の次元数から自動的に計算してね」という意味で、使いこなすとコードが非常に簡潔になります。

mat.reshape(3, -1)  # 要素数が6なので → (3, 2)

axisとは?集計・操作に欠かせない概念

axis=0とaxis=1の違いを図で理解

NumPyを使ううえで混乱しやすいのが「axis(アクシス)」の概念です。axisとは「どの方向に対して処理を行うか」を指定するための番号です。2次元配列で言えば:

  • axis=0 → 縦方向(列ごとの演算)
  • axis=1 → 横方向(行ごとの演算)
mat2d = np.array([[1, 2, 3], [4, 5, 6]])
print(np.sum(mat2d, axis=0))  # 各列の合計 → [5 7 9]
print(np.sum(mat2d, axis=1))  # 各行の合計 → [6 15]

このように、axisの指定次第でまったく異なる結果になるので、処理対象の「向き」をしっかり意識することが大切です。

よく使う関数×axisの使い方

axisはさまざまな関数と組み合わせて使います。よく使うものに以下があります:

print(np.mean(mat2d, axis=0))  # 列ごとの平均 → [2.5 3.5 4.5]
print(np.max(mat2d, axis=1))   # 行ごとの最大値 → [3 6]

他にも、np.min(), np.std(), np.sum() などもすべて axis パラメータを使って行または列に限定した処理ができます。


スライスと部分抽出の基本

一次元配列のスライス

NumPyでもPythonリストと同じように、インデックス指定による「スライス」が使えます。スライスは配列の一部を取り出す操作で、データの前処理や可視化などに頻出します。

arr = np.array([10, 20, 30, 40, 50])
print(arr[1:4])  # [20 30 40]

このように、[開始:終了] という形で範囲を指定します(終了は含まれない点に注意)。

多次元配列の行列抽出

多次元配列では [行, 列] の形で要素や範囲を抽出します。これを使いこなすと、行ごと・列ごとのデータ操作や条件抽出がスムーズに行えます。

mat = np.array([[1, 2, 3], [4, 5, 6]])
print(mat[1, 2])  # → 6
print(mat[:, 1])  # 2列目だけ抽出 → [2 5]
print(mat[0, :])  # 1行目だけ抽出 → [1 2 3]

このように、行列の一部だけを簡単に抜き出せるのがNumPyの強みです。


総まとめと演習問題

よくあるエラーの原因と対処

  • reshape() で ValueError → 要素数を確認(足したら元と同じ数?)
  • axis の誤指定 → 次元と軸の方向を整理するクセをつける
  • スライスで IndexError → 配列の shape を先に確認する

簡単な配列操作クイズ

  1. np.arange(12).reshape(3, 4) の2行目を抽出するコードは? → arr[1, :]
  2. axis=0mean() を取るとどうなる? → 各「列の平均値」が返ってくる(縦方向の演算)

おわりに

この記事では、NumPy配列の「reshape」「axis」「スライス」に焦点を当てて、配列操作の基本を丁寧に解説してきました。これらの知識は、機械学習や統計分析、画像処理などに進むための確かな土台になります。

配列の形を自在に変え、必要な範囲だけを取り出し、特定方向に演算を加える。これができるようになると、NumPyの力を最大限に引き出すことができるようになります。

次回は、NumPyの強力な機能「ブロードキャスト」や「条件抽出」をテーマに、さらに実用的なテクニックを紹介していきます。

✅ NumPy中級シリーズ:目次リンク

🔹 NumPy中級シリーズ一覧(基礎〜応用)

  1. 【中級①】配列操作の基本と応用|reshape・axis・スライスをマスター
     ↳ NumPy中級①:配列操作の基本と応用|reshape・axis・スライスをマスター
  2. 【中級②】ブロードキャストと演算の仕組みを徹底解説
     ↳ NumPy中級②:ブロードキャストと演算の仕組みを徹底解説
  3. 【中級③】条件抽出と論理演算|配列を自在にフィルタリングする
     ↳ NumPy中級③:条件抽出と論理演算|配列を自在にフィルタリングする
  4. 【中級④】乱数生成とシミュレーション|再現性と統計処理の基礎
     ↳ NumPy中級④:乱数生成とシミュレーション|再現性と統計処理の基本
  5. 【中級⑤】応用編:np.where, np.select, np.any, np.allの便利な使い方
     ↳ NumPy中級⑤:便利関数大全|np.where, np.any, np.all, np.select を使いこなす

コメント

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