Python

Pythonでベクトル・行列を扱う方法を解説

By 2021年3月25日No Comments

人工知能などの科学計算の分野では、ベクトルや行列の計算をすることがよくあります。

PythonのNumpyライブラリを使うと、ベクトルや行列の計算を簡単に行うことができますので、実際に試してみましょう。

ベクトルとは?

一般的に、コンピュータ上の数値計算でいうベクトルとは、1次元の配列のことです。

例えば、[1, 1]や、[2, 4, 6, 8]もベクトルです。

Pythonでベクトルを生成するには、Numpyライブラリを使って、以下のように書きます。

ベクトル = numpy.array( 1次元配列 )

import numpy

vector = numpy.array([2, 4, 6, 8])
print(vector)

実行結果

[2 4 6 8]

ベクトルとベクトルの演算

要素数が等しいベクトル同士は四則演算ができます。

例えば、[1,2,3] と [4,5,6] の足し算は、同じ位置の要素同士を足し算して、[5,7,9]になります。

掛け算などの他の演算も同様に、同じ位置の要素同士を演算した結果になります。

vector1 = numpy.array([1, 2, 3])
vector2 = numpy.array([4, 5, 6])

a = vector1 + vector2   # [1 + 4, 2 + 5, 3 + 6]
b = vector1 - vector2   # [1 - 4, 2 - 5, 3 - 6]
c = vector1 * vector2   # [1 * 4, 2 * 5, 3 * 6]
d = vector1 / vector2   # [1 / 4, 2 / 5, 3 / 6]

print("足し算:", a)
print("引き算:", b)
print("掛け算:", c)
print("割り算:", d)

実行結果

足し算: [5 7 9]
引き算: [-3 -3 -3]
掛け算: [ 4 10 18]
割り算: [0.25 0.4  0.5 ]

なお、「*」演算子は要素ごとの掛け算を表す演算子であって、ベクトルの「内積」を表すわけではないことに注意してください。

ベクトルとスカラーの演算

一般的な数学では、ベクトルと、1つの数値(スカラー)の足し算はできません。例えば、[1, 2, 3] + 4 のような足し算はできません。

Numpyでは、ベクトルとスカラーの足し算は、スカラーを繰り返してベクトルに変換することで計算されます。

例えば、[1, 2, 3] + 4 の計算は、スカラーの4を繰り返して、[4, 4, 4]というベクトルに変換し、[1, 2, 3] + [4, 4, 4] = [5, 6, 7]というように計算されます。

掛け算などの他の演算も同様に、スカラーをベクトルに変換することで計算されます。

vector = numpy.array([1, 2, 3])
num = 4

a = vector + num   # [1, 2, 3] + [4, 4, 4]
b = vector - num   # [1, 2, 3] - [4, 4, 4]
c = vector * num   # [1, 2, 3] * [4, 4, 4]
d = vector / num   # [1, 2, 3] / [4, 4, 4]

print("足し算:", a)
print("引き算:", b)
print("掛け算:", c)
print("割り算:", d) 

実行結果

足し算: [5 6 7]
引き算: [-3 -2 -1]
掛け算: [ 4  8 12]
割り算: [0.25 0.5  0.75]

ベクトルとスカラーの順序を入れ替えても、計算方法は同じく、ベクトル同士の演算として計算されます。

a = vector - num   # [1, 2, 3] - [4, 4, 4]
b = num - vector   # [4, 4, 4] - [1, 2, 3]

print("(ベクトル) - (スカラー):", a)
print("(スカラー) - (ベクトル):", b)

実行結果

(ベクトル) - (スカラー): [-3 -2 -1]
(スカラー) - (ベクトル): [3 2 1]

ちなみに、ベクトルとスカラーの演算のように、次元数や形状が揃っていない場合でも、プログラム側がそれらを揃えて計算してくれる機能のことを、「ブロードキャスト」と言います。

ベクトルの内積

ベクトルの内積とは、要素数が等しいベクトル同士における、要素ごとの積の総和です。

例えば、[1, 2, 3] と [4, 5, 6]の内積は、(1 × 4) + (2 × 5) + (3 × 6) = 32 となります。

Numpyでは、以下のように計算します。

内積 = numpy.dot(ベクトル1, ベクトル2)

vector1 = numpy.array([1, 2, 3])
vector2 = numpy.array([4, 5, 6])

a = numpy.dot(vector1, vector2)
print(a)

実行結果

32

行列とは?

一般的に、コンピュータ上の数値計算でいう行列とは、行と列の2次元で表される配列のことです。

例えば、下記はすべて行列です。

・3行2列の行列

[[1, 1],

 [1, 1],

 [1, 1]]

・1行3列の行列

[[1, 2, 3]]

・3行1列の行列

[[1],

 [2],

 [3]]

Pythonで行列を生成するには、Numpyライブラリを使って、以下のように書きます。

行列 = numpy.array( 2次元配列 )

import numpy

arr =[[1, 1],
      [1, 1],
      [1, 1]]

matrix = numpy.array(arr)
print(matrix)

実行結果

[[1 1]
[1 1]
[1 1]]

行列と行列の演算

ベクトル同士の演算と同じように、形状が等しい行列同士は演算ができます。

例えば、

[[1, 2],

 [3, 4],

 [5, 6]]

と、

[[ 2,  4],

 [ 6,  8],

 [10, 12]]

の足し算は、同じ位置の要素同士を足し算して、

[[ 3  6]

 [ 9 12]

 [15 18]]

となります。

掛け算などの他の演算も同様に、同じ位置の要素同士を演算した結果になります。

arr1 = [[1, 2],
        [3, 4],
        [5, 6]]

arr2 = [[ 2,  4],
        [ 6,  8],
        [10, 12]]

matrix1 = numpy.array(arr1)
matrix2 = numpy.array(arr2)

a = matrix1 + matrix2  
b = matrix1 - matrix2
c = matrix1 * matrix2
d = matrix1 / matrix2

print("足し算:", a, sep='\n')
print("引き算:", b, sep='\n')
print("掛け算:", c, sep='\n')
print("割り算:", d, sep='\n') 

実行結果

足し算:
[[ 3  6]
[ 9 12]
[15 18]]
引き算:
[[-1 -2]
[-3 -4]
[-5 -6]]
掛け算:
[[ 2  8]
[18 32]
[50 72]]
割り算:
[[0.5 0.5]
[0.5 0.5]
[0.5 0.5]]

なお、要素ごとの掛け算結果は「アダマール積」と呼ばれる積です。「行列の積」とは別物であることに注意してください。

行列とスカラーの演算

ベクトルとスカラーの演算と同じように、行列とスカラーの演算は、スカラー側を繰り返して行列に変換することで計算されます。

例えば、スカラー値3と、

[[1, 2],

 [3, 4],

 [5, 6]]

との足し算は、スカラー値3を繰り返して

[[3, 3],

 [3, 3],

 [3, 3]]

という行列に変換し、同じ位置の要素同士を足し算して、

[[4 5]

 [6 7]

 [8 9]]

となります。

掛け算などの他の演算も同様に、スカラーを行列に変換することで計算されます。

arr = [[1, 2],
      [3, 4],
      [5, 6]]

matrix = numpy.array(arr)
num = 3

a = matrix1 + num  
b = matrix1 - num
c = matrix1 * num
d = matrix1 / num

print("足し算:", a, sep='\n')
print("引き算:", b, sep='\n')
print("掛け算:", c, sep='\n')
print("割り算:", d, sep='\n') 

実行結果

足し算:
[[4 5]
[6 7]
[8 9]]
引き算:
[[-2 -1]
[ 0  1]
[ 2  3]]
掛け算:
[[ 3  6]
[ 9 12]
[15 18]]
割り算:
[[0.33333333 0.66666667]
[1.         1.33333333]
[1.66666667 2.        ]]

行列の積

行列の積とは、下記のような数式で表される演算のことです。

行列の積を計算する方法は下記の2種類があります。

numpy.dot(行列1, 行列2)

行列1 @ 行列2

A = numpy.array([[1,2,3],[4,5,6]])
B = numpy.array([[7,8],[9,10],[11,12]])

AB = numpy.dot(A, B)
print(AB)

AB = A @ B # NumPy 1.10.0 以降で使用可能
print(AB)

実行結果

[[ 58  64]
[139 154]]
[[ 58  64]
[139 154]]

逆行列

ある正方行列Aに対して、右から掛けても左から掛けても単位行列Eとなるような行列のことを、Aの逆行列と言います。

逆行列は下記で計算することができます。

numpy.linalg.inv(行列)

A = numpy.array([[3,1,2],[7,1,1],[5,6,0]])

A_inv = numpy.linalg.inv(A)
print(A_inv)

実行結果

[[-0.09836066  0.19672131 -0.01639344]
[ 0.08196721 -0.16393443  0.18032787]
[ 0.60655738 -0.21311475 -0.06557377]]

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト
HOSL

Author HOSL

More posts by HOSL