はじめに#
NumPyは、Pythonで科学技術計算を効率的に行うためのコアライブラリです。特に、多次元配列(ndarray)を高速に扱うための機能が豊富に用意されており、データ分析や機械学習の分野で必須のツールとなっています。
以下に、NumPyの基本的な使い方から応用的な内容まで、実用的な活用方法を解説とコード例付きで説明します。
インストールとインポート#
インストール#
まず、NumPyライブラリをインストールします。ターミナルで以下のコマンドを実行してください。
pip install numpy
インポート#
Pythonスクリプト内でNumPyを使うには、import文を記述します。慣例として np という別名を付けてインポートするのが一般的です。
import numpy as np
基本的な使い方#
1. 配列 (ndarray) の作成#
NumPyの基本は ndarray オブジェクトです。様々な方法で配列を作成できます。
| 目的 | コード例 | 解説 |
|---|---|---|
| リストから作成 | np.array([1, 2, 3]) | Pythonのリストやタプルを元にNumPy配列を作成します。 |
| 連番配列の作成 | np.arange(0, 10, 2) | range関数のように、指定した範囲とステップで要素を生成します (この例では [0, 2, 4, 6, 8])。 |
| ゼロ行列 | np.zeros((2, 3)) | すべての要素が 0 の配列を生成します。形状をタプルで指定します (この例では2行3列)。 |
| 全要素が1の行列 | np.ones((3, 2)) | すべての要素が 1 の配列を生成します。 |
| 単位行列 | np.eye(3) | 対角成分が 1 で、それ以外が 0 の正方行列(単位行列)を生成します (この例では3x3)。 |
コード例:
# Pythonのリストから2次元配列を作成
arr2d = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2d)
#=> [[1 2 3]
# [4 5 6]]
# 0から9までの整数の配列を作成
range_arr = np.arange(10)
print(range_arr)
#=> [0 1 2 3 4 5 6 7 8 9]
2. 配列の基本情報#
配列がどのようなものかを確認するための属性です。
arr = np.array([[1, 2, 3], [4, 5, 6]]) を例とします。
| 属性 | コード | 結果 | 解説 |
|---|---|---|---|
| 形状 (Shape) | arr.shape | (2, 3) | 配列の各次元の要素数をタプルで返します (行数, 列数)。 |
| 次元数 (Dimensions) | arr.ndim | 2 | 配列の次元の数を返します。 |
| 要素数 (Size) | arr.size | 6 | 配列に含まれる全要素の数を返します。 |
| データ型 (Data Type) | arr.dtype | int64 | 配列の要素のデータ型を返します。 |
3. インデックスとスライシング#
配列から特定の要素や部分を取り出す操作です。
a = np.arange(10) B = np.array([[1,2,3],[4,5,6],[7,8,9]]) を例とします。
| 目的 | コード例 | 解説 |
|---|---|---|
| 要素へのアクセス | a[3]B[1, 2] | インデックスを指定して要素を取得します。B[1, 2]は2行目・3列目の要素 6 を返します。 |
| スライシング | a[2:5] | [start:stop] の形式で、指定した範囲の要素を抽出します (この例ではインデックス2から4まで)。 |
| 逆順 | a[::-1] | 配列の要素を逆順にします。 |
| 行・列の抽出 | B[0, :]B[:, 1] | : はその軸のすべての要素を意味します。B[0, :]は1行目全体、B[:, 1]は2列目全体を抽出します。 |
| 部分行列の抽出 | B[1:, 1:] | 2行目以降、かつ2列目以降の要素を抽出します。 |
4. 配列の操作#
| 目的 | コード例 | 解説 |
|---|---|---|
| 形状変更 | arr.reshape(3, 2) | 要素数を変えずに配列の形状を変更します。 |
| 転置 | arr.T | 行と列を入れ替えた配列を返します。 |
| 垂直結合 | np.vstack((arr1, arr2)) | 2つの配列を垂直(行)方向に結合します。 |
| 水平結合 | np.hstack((arr1, arr2)) | 2つの配列を水平(列)方向に結合します。 |
| 垂直分割 | np.vsplit(arr, 2) | 配列を垂直方向に指定した数に分割します。 |
| 水平分割 | np.hsplit(arr, 2) | 配列を水平方向に指定した数に分割します。 |
コード例:
e = np.arange(12) #=> [0, 1, ..., 11]
reshaped_e = e.reshape(3, 4)
print(reshaped_e)
#=> [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(reshaped_e.T) # 転置
#=> [[ 0 4 8]
# [ 1 5 9]
# [ 2 6 10]
# [ 3 7 11]]
5. 配列の演算#
基本的な演算#
a = np.array([[1, 2], [3, 4]]), b = np.array([[5, 6], [7, 8]]) を例とします。
| 目的 | 演算子 | 関数 | 解説 |
|---|---|---|---|
| 要素ごとの加減乗除 | +, -, *, / | - | 同じ位置にある要素同士で計算が行われます。 |
| 行列積 | @ | np.dot(a, b) | 数学的な行列の積を計算します。 |
| スカラー倍 | * | - | a * 3 のように、配列の全要素を定数倍します。 |
ブロードキャスト#
形状が異なる配列同士の演算でも、NumPyが自動的に形状を拡張して計算する機能です。
arr = np.array([[1, 2, 3], [4, 5, 6]])
scalar = np.array([10, 20, 30])
# arr(2x3)とscalar(1x3)の加算
# scalarがarrの各行に対して加算される
result = arr + scalar
print(result)
#=> [[11 22 33]
# [14 25 36]]
実践的な使い方#
数学・統計関数#
統計関数#
data = np.array([[2, 4, 6], [-1, 5, -3]]) を例とします。
| 目的 | コード例 | 解説 |
|---|---|---|
| 最大値 | data.max() | 全要素の中での最大値を返します。 |
| 最小値 | data.min() | 全要素の中での最小値を返します。 |
| 合計 | data.sum() | 全要素の合計を返します。 |
| 平均 | data.mean() | 全要素の平均値を返します。 |
| 分散 | data.var() | 全要素の分散を返します。 |
| 標準偏差 | data.std() | 全要素の標準偏差を返します。 |
軸(axis)の指定:
axis引数を指定することで、行ごとや列ごとの計算が可能です。
axis=0: 列方向の計算(各列での集計)axis=1: 行方向の計算(各行での集計)
# 列ごとの合計
print(data.sum(axis=0)) #=> [1 9 3]
# 行ごとの最小値
print(data.min(axis=1)) #=> [2 -3]
ユニバーサル関数 (UFuncs)#
配列の各要素に対して数学的な関数を適用します。
| 目的 | コード例 |
|---|---|
| 平方根 | np.sqrt(arr) |
| 指数関数 | np.exp(arr) |
| 三角関数 | np.sin(arr), np.cos(arr) |
線形代数#
np.linalg モジュールには線形代数関連の関数が含まれています。
| 目的 | コード例 |
|---|---|
| 行列式 | np.linalg.det(matrix) |
| 逆行列 | np.linalg.inv(matrix) |
| 固有値・固有ベクトル | np.linalg.eig(matrix) |