人工知能などの科学計算の分野では、ベクトルや行列の計算をすることがよくあります。
PythonのNumpyライブラリを使うと、ベクトルや行列の計算を簡単に行うことができますので、実際に試してみましょう。
目次
Udemyの動画学習でもPythonを勉強しよう!
「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!
UdemyのPythonおすすめ33講座レビューリストベクトルとは?
一般的に、コンピュータ上の数値計算でいうベクトルとは、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講座レビューリスト