メインコンテンツへスキップ

NumPy入門

·
目次

はじめに
#

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.ndim2配列の次元の数を返します。
要素数 (Size)arr.size6配列に含まれる全要素の数を返します。
データ型 (Data Type)arr.dtypeint64配列の要素のデータ型を返します。

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)

参考リンク
#