[Python] NumPy – 行列を作成する方法

NumPyでは、行列を作成するために主にnumpy.array()numpy.matrix()を使用します。

numpy.array()は多次元配列を作成するための一般的な関数で、リストやタプルを引数に渡すことで行列を作成できます。

例えば、numpy.array([[1, 2], [3, 4]])は2×2の行列を生成します。

numpy.matrix()は行列専用のデータ型を作成しますが、現在は推奨されていません。

行列演算にはnumpy.dot()@演算子を使用します。

この記事でわかること
  • NumPyを使った行列の作成方法
  • 行列の基本操作とその使い方
  • 行列の演算に関する具体例
  • 行列を用いたデータ分析の応用
  • 機械学習における行列の重要性

目次から探す

NumPyで行列を作成する方法

NumPyはPythonで数値計算を行うための強力なライブラリで、行列や多次元配列の操作が得意です。

ここでは、NumPyを使ってさまざまな行列を作成する方法を紹介します。

numpy.array()を使った行列の作成

numpy.array()を使用すると、リストやタプルから簡単に行列を作成できます。

import numpy as np
# リストから行列を作成
matrix = np.array([[1, 2, 3], [4, 5, 6]])
print(matrix)
[[1 2 3]
 [4 5 6]]

numpy.zeros()を使ったゼロ行列の作成

numpy.zeros()を使うと、指定した形状のゼロで埋められた行列を作成できます。

import numpy as np
# 3行2列のゼロ行列を作成
zero_matrix = np.zeros((3, 2))
print(zero_matrix)
[[0. 0.]
 [0. 0.]
 [0. 0.]]

numpy.ones()を使った全ての要素が1の行列の作成

numpy.ones()を使用すると、全ての要素が1の行列を作成できます。

import numpy as np
# 2行3列の全ての要素が1の行列を作成
ones_matrix = np.ones((2, 3))
print(ones_matrix)
[[1. 1. 1.]
 [1. 1. 1.]]

numpy.eye()を使った単位行列の作成

numpy.eye()を使うと、対角成分が1でそれ以外が0の単位行列を作成できます。

import numpy as np
# 4x4の単位行列を作成
identity_matrix = np.eye(4)
print(identity_matrix)
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]

numpy.full()を使った任意の値で埋めた行列の作成

numpy.full()を使用すると、指定した値で埋められた行列を作成できます。

import numpy as np
# 2行2列の行列を全て7で埋める
full_matrix = np.full((2, 2), 7)
print(full_matrix)
[[7 7]
 [7 7]]

numpy.random()を使ったランダム行列の作成

numpy.randomモジュールを使うと、ランダムな値で埋められた行列を作成できます。

import numpy as np
# 3行3列のランダム行列を作成
random_matrix = np.random.rand(3, 3)
print(random_matrix)
[[0.12345678 0.23456789 0.3456789 ]
 [0.45678901 0.56789012 0.67890123]
 [0.78901234 0.89012345 0.90123456]]

これらの方法を使うことで、さまざまな行列を簡単に作成することができます。

NumPyを活用して、効率的な数値計算を行いましょう。

行列の基本操作

NumPyを使用すると、行列に対してさまざまな基本操作を簡単に行うことができます。

ここでは、行列の形状確認、要素へのアクセス、転置、リサイズ、結合について説明します。

行列の形状を確認するshape

行列の形状は、shape属性を使って確認できます。

形状は、行数と列数のタプルとして返されます。

import numpy as np
# 行列を作成
matrix = np.array([[1, 2, 3], [4, 5, 6]])
# 行列の形状を確認
shape = matrix.shape
print(shape)
(2, 3)

行列の要素にアクセスする方法

行列の要素には、インデックスを使ってアクセスできます。

インデックスは0から始まります。

import numpy as np
# 行列を作成
matrix = np.array([[1, 2, 3], [4, 5, 6]])
# 特定の要素にアクセス
element = matrix[1, 2]  # 2行目の3列目の要素
print(element)
6

行列の転置transpose

行列の転置は、transpose()メソッドまたはT属性を使って行います。

行と列が入れ替わります。

import numpy as np
# 行列を作成
matrix = np.array([[1, 2, 3], [4, 5, 6]])
# 行列の転置
transposed_matrix = matrix.transpose()
print(transposed_matrix)
[[1 4]
 [2 5]
 [3 6]]

行列のリサイズreshape

reshape()メソッドを使うと、行列の形状を変更できます。

新しい形状は元の要素数と一致する必要があります。

import numpy as np
# 行列を作成
matrix = np.array([[1, 2, 3], [4, 5, 6]])
# 行列のリサイズ
reshaped_matrix = matrix.reshape((3, 2))
print(reshaped_matrix)
[[1 2]
 [3 4]
 [5 6]]

行列の結合concatenate

numpy.concatenate()を使うと、複数の行列を結合できます。

結合する軸を指定することも可能です。

import numpy as np
# 行列を作成
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])
# 行列の結合
concatenated_matrix = np.concatenate((matrix1, matrix2), axis=0)  # 縦に結合
print(concatenated_matrix)
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

これらの基本操作を理解することで、NumPyを使った行列の扱いがよりスムーズになります。

行列の操作をマスターして、データ分析や数値計算に役立てましょう。

行列の演算

NumPyを使用すると、行列に対してさまざまな演算を簡単に行うことができます。

ここでは、行列の加算・減算、スカラー倍、行列の積、逆行列、行列式、固有値について説明します。

行列の加算・減算

同じ形状の行列同士は、加算や減算が可能です。

要素ごとに計算が行われます。

import numpy as np
# 行列を作成
matrix1 = np.array([[1, 2, 3], [4, 5, 6]])
matrix2 = np.array([[7, 8, 9], [10, 11, 12]])
# 行列の加算
sum_matrix = matrix1 + matrix2
print("加算結果:\n", sum_matrix)
# 行列の減算
difference_matrix = matrix1 - matrix2
print("減算結果:\n", difference_matrix)
加算結果:
 [[ 8 10 12]
 [14 16 18]]
減算結果:
 [[-6 -6 -6]
 [-6 -6 -6]]

行列のスカラー倍

行列の全ての要素にスカラー値を掛けることができます。

import numpy as np
# 行列を作成
matrix = np.array([[1, 2], [3, 4]])
# スカラー倍
scaled_matrix = matrix * 3
print(scaled_matrix)
[[ 3  6]
 [ 9 12]]

行列の積dotと@演算子

行列の積は、dot()メソッドまたは@演算子を使って計算できます。

行列の内積が計算されます。

import numpy as np
# 行列を作成
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])
# 行列の積
product_matrix_dot = np.dot(matrix1, matrix2)
product_matrix_at = matrix1 @ matrix2
print("dot演算子による積:\n", product_matrix_dot)
print("@演算子による積:\n", product_matrix_at)
dot演算子による積:
 [[19 22]
 [43 50]]
@演算子による積:
 [[19 22]
 [43 50]]

行列の逆行列inv

逆行列は、行列が正方行列である場合にのみ存在します。

numpy.linalg.inv()を使って計算できます。

import numpy as np
# 行列を作成
matrix = np.array([[1, 2], [3, 4]])
# 行列の逆行列
inverse_matrix = np.linalg.inv(matrix)
print(inverse_matrix)
[[-2.   1. ]
 [ 1.5 -0.5]]

行列の行列式det

行列の行列式は、正方行列に対して計算できます。

numpy.linalg.det()を使って求めます。

import numpy as np
# 行列を作成
matrix = np.array([[1, 2], [3, 4]])
# 行列の行列式
determinant = np.linalg.det(matrix)
print(determinant)
-2.0000000000000004

行列の固有値eig

固有値と固有ベクトルは、numpy.linalg.eig()を使って計算できます。

import numpy as np
# 行列を作成
matrix = np.array([[1, 2], [2, 1]])
# 固有値と固有ベクトルを計算
eigenvalues, eigenvectors = np.linalg.eig(matrix)
print("固有値:\n", eigenvalues)
print("固有ベクトル:\n", eigenvectors)
固有値:
 [ 3. -1.]
固有ベクトル:
 [[ 0.70710678 -0.70710678]
 [ 0.70710678  0.70710678]]

これらの演算を理解することで、NumPyを使った行列の計算がより効果的に行えるようになります。

行列演算を活用して、データ分析や数値計算を行いましょう。

応用例:行列を使ったデータ分析

行列はデータ分析や機械学習の分野で非常に重要な役割を果たします。

ここでは、行列を使ったいくつかの応用例を紹介します。

行列を使った線形回帰

線形回帰は、与えられたデータに基づいて直線をフィッティングする手法です。

行列を使って、回帰係数を求めることができます。

import numpy as np
# データセット
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])  # 特徴量
y = np.array([1, 2, 2, 3])  # 目的変数
# 行列の形を整える
X_b = np.c_[np.ones((X.shape[0], 1)), X]  # バイアス項を追加
# 正規方程式を使って回帰係数を計算
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print("回帰係数:", theta_best)
回帰係数: [0. 1. 1.]

行列を使った主成分分析(PCA)

主成分分析は、高次元データを低次元に圧縮する手法です。

行列の固有値分解を用いて、データの分散を最大化する方向を見つけます。

import numpy as np
# サンプルデータ
X = np.array([[2.5, 2.4], [0.5, 0.7], [2.2, 2.9], [1.9, 2.2], [3.1, 3.0]])
# データの平均を引く
X_meaned = X - np.mean(X, axis=0)
# 共分散行列を計算
cov_matrix = np.cov(X_meaned, rowvar=False)
# 固有値と固有ベクトルを計算
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
# 主成分を取得
principal_components = eigenvectors[:, :2]  # 上位2つの主成分
print("主成分:\n", principal_components)
主成分:
 [[ 0.72474155 -0.68902082]
 [ 0.68902082  0.72474155]]

行列を使った画像処理

画像は行列として表現され、各ピクセルの色が行列の要素に対応します。

行列演算を使って画像のフィルタリングや変換が行えます。

import numpy as np
import matplotlib.pyplot as plt
# サンプル画像を生成
image = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
# 画像を表示
plt.imshow(image, cmap='gray')
plt.title("元の画像")
plt.show()
# 画像のスカラー倍
scaled_image = image * 2
# スカラー倍した画像を表示
plt.imshow(scaled_image, cmap='gray')
plt.title("スカラー倍した画像")
plt.show()

行列を使った機械学習モデルの構築

機械学習モデルは、行列を使ってデータを表現し、学習を行います。

例えば、ニューラルネットワークでは、重み行列を使って入力データを変換します。

import numpy as np
# 入力データ
X = np.array([[0.1, 0.2], [0.3, 0.4]])
# 重み行列
weights = np.array([[0.5, 0.6], [0.7, 0.8]])
# 出力を計算
output = X.dot(weights)
print("出力:\n", output)
出力:
 [[0.19 0.22]
 [0.43 0.50]]

これらの応用例を通じて、行列がデータ分析や機械学習においてどれほど重要であるかがわかります。

行列を活用して、さまざまなデータ処理や分析を行いましょう。

よくある質問

numpy.array()とnumpy.matrix()の違いは?

numpy.array()numpy.matrix()は、どちらもNumPyで多次元配列を扱うための関数ですが、いくつかの重要な違いがあります。

  • データ構造: numpy.array()は一般的な多次元配列を作成し、任意の次元を持つことができます。

一方、numpy.matrix()は常に2次元の行列を作成します。

  • 演算の違い: numpy.array()では、*演算子は要素ごとの積を計算しますが、numpy.matrix()では行列の積を計算します。

これにより、同じ演算子が異なる結果をもたらすことがあります。

  • 推奨: NumPyの公式ドキュメントでは、numpy.matrix()は非推奨とされており、numpy.array()の使用が推奨されています。

行列のサイズを変更するにはどうすればいいですか?

行列のサイズを変更するには、reshape()メソッドを使用します。

このメソッドを使うことで、元の行列の要素数を保持したまま、新しい形状に変更できます。

以下のように使用します。

import numpy as np
# 行列を作成
matrix = np.array([[1, 2, 3], [4, 5, 6]])
# 行列のリサイズ
reshaped_matrix = matrix.reshape((3, 2))
print(reshaped_matrix)
[[1 2]
 [3 4]
 [5 6]]

新しい形状は元の要素数と一致する必要があります。

例えば、6要素の行列を2行3列や3行2列に変更することができますが、4行2列のように要素数が合わない形状には変更できません。

行列の逆行列が存在しない場合はどうすればいいですか?

行列の逆行列が存在しない場合、つまり行列が特異行列(行列式が0の行列)である場合、逆行列を計算することはできません。

このような場合には、以下のアプローチを考慮できます。

  • 擬似逆行列: numpy.linalg.pinv()を使用して、擬似逆行列を計算することができます。

擬似逆行列は、最小二乗解を求める際に役立ちます。

  import numpy as np
  # 特異行列を作成
  matrix = np.array([[1, 2], [2, 4]])
  # 擬似逆行列を計算
  pseudo_inverse = np.linalg.pinv(matrix)
  print(pseudo_inverse)
  • データの再評価: 行列が特異である理由を考え、データを再評価することも重要です。

例えば、重複した行や列がある場合、それを削除することで逆行列が存在するようにすることができます。

これらの方法を使って、逆行列が存在しない場合でも問題を解決することができます。

まとめ

この記事では、NumPyを使用した行列の作成や基本操作、演算、応用例について詳しく解説しました。

行列はデータ分析や機械学習において非常に重要な役割を果たしており、さまざまな手法で活用されています。

これを機に、NumPyを使った行列操作を実践し、データ分析や機械学習のスキルを向上させてみてください。

  • URLをコピーしました!
目次から探す