>開発>python>[Pythonで数学]ベクトル

ベクトル

ベクトルは、大きさと向きを持つ量のこと。1個の数の場合は、1次元ベクトル、2個の場合は2次元ベクトル、3個の場合は3次元ベクトル、n個の場合はn次元ベクトルと言う。

縦ベクトル : \(\displaystyle \left( \begin{array}{c} x_1 \\ x_2 \\ \vdots \\ x_n \end{array}\right) \)

\(\displaystyle T \)は、ベクトル\(\displaystyle x \)の転置行列を表している。転置行列は、行列の行と列を入れ替えた時の行列。縦ベクトルを転置行列で表すと横ベクトルになる。

横ベクトル : \(\displaystyle x^T = (x_1, x_2, \dots, x_n) \)

ベクトルの長さ : \(\displaystyle \vert \vert x \vert \vert = \sqrt{\sum_{k=1}^n} x_k^2 \)

Pythonでベクトルの足し算を求める

ベクトルは、リストで表現することができる。また、ベクトルはスカラーなので、普通に足し算、引き算ができる。まずは、ベクトルの足し算を考えてみる。

from matplotlib import pylab as plt

# ベクトルx
x = [1, 4]
# ベクトルy
y = [2, 3]
add_result = [0, 0]

for i in range(len(x)):
  # ベクトルの足し算
  add_result[i] = x[i] + y[i]

print(add_result)

fig, ax = plt.subplots()
# xとy軸の制限
plt.xlim([0, 10])
plt.ylim([0, 10])
# 注釈
ax.annotate('x', xy=(x[0], x[1]))
ax.annotate('y', xy=(y[0], y[1]))
ax.annotate('result', xy=(add_result[0], add_result[1]))
# ベクトル場
ax.quiver(0, 0, x[0], x[1], angles='xy', scale_units='xy', scale=1)
ax.quiver(0, 0, y[0], y[1], angles='xy', scale_units='xy', scale=1)
ax.quiver(0, 0, add_result[0], add_result[1], angles='xy', scale_units='xy', scale=1)
[3, 7]

このように、ベクトルの足し算、引き算はリストのそれぞれの要素が足し算、引き算されて出力されるだけ。グラフでは、ベクトルの足し算した結果は、ベクトルxとベクトルyの隣り合う辺とする平行四辺形の対角線となる。

Pythonでベクトルの引き算を求める

次にベクトルの引き算を考えてみる。

from matplotlib import pylab as plt

# ベクトルx
x = [1, 6]
# ベクトルy
y = [4, 2]
sub_result = [0, 0]

for i in range(len(x)):
  # ベクトルの引き算
  sub_result[i] = x[i] - y[i]

print(sub_result)

fig, ax = plt.subplots()
# xとy軸の制限
plt.xlim([-10, 10])
plt.ylim([-10, 10])
# 注釈
ax.annotate('x', xy=(x[0], x[1]))
ax.annotate('y', xy=(y[0], y[1]))
ax.annotate('-y', xy=(-y[0] - 0.5, -y[1]))
ax.annotate('sub_result', xy=(sub_result[0] - 2, sub_result[1]))
# ベクトル場
ax.quiver(0, 0, x[0], x[1], angles='xy', scale_units='xy', scale=1)
ax.quiver(0, 0, y[0], y[1], angles='xy', scale_units='xy', scale=1)
ax.quiver(0, 0, -y[0], -y[1], angles='xy', scale_units='xy', scale=1)
ax.quiver(0, 0, sub_result[0], sub_result[1], angles='xy', scale_units='xy', scale=1)
[-3, 4]

\(\displaystyle x – y = x + (-y) \)なので、ベクトルの引き算は、ベクトルyの反対向きのベクトル、つまりベクトル-yとベクトルxの隣り合う辺とする平行四辺形の対角線となる。

Pythonでベクトルの長さを求める

\(\displaystyle \vec{x} = \left( \begin{array}{c} 3 \\ 4 \end{array}\right) \)のベクトルの長さを求めてみる。

ベクトルの長さ : \(\displaystyle \vert \vert x \vert \vert = \sqrt{\sum_{k=1}^n} x_k^2 \)

計算すると次のようになる。\(\displaystyle \vert \vert x \vert \vert = \sqrt{\sum_{k=1}^2} x_k^2 = \sqrt{3^2 + 4^2} = 5 \)

import math

x = [3, 4]
long = 0

for i in x:
  long += math.pow(i, 2)

result = math.sqrt(long)
print(result)
5.0

ちゃんと、結果が5.0となった。

numpyでのベクトル

numpyでもベクトルを扱うことができる。また、norm関数でベクトルの長さを求めることができる。

import numpy as np

x = np.array([3, 4])
y = np.array([2, 3])

# 足し算
print(x + y)

# 引き算
print(x - y)

# 長さ
long = np.linalg.norm(x)
print(long)
[5 7]
[1 1]
5.0

内積

内積は、ベクトルの掛け算に相当する。また、\(\displaystyle \theta \)は、2つのベクトルがなす角を表す。

ベクトルx : \(\displaystyle x = \left( \begin{array}{c} x_1 \\ x_2 \\ \vdots \\ x_n \end{array}\right) \)

ベクトルy : \(\displaystyle y = \left( \begin{array}{c} y_1 \\ y_2 \\ \vdots \\ y_n \end{array}\right) \)

内積 : \(\displaystyle x \cdot y = \sum_{k=1}^{n} x_k y_k = \vert \vert x \vert \vert \vert \vert y \vert \vert \cos \theta \)

Pythonで内積を求める

# ベクトルx
x = [3, 2]
# ベクトルy
y = [4, 5]
inner_product = 0

for i in range(len(x)):
  # 角ベクトルの要素を掛けるて足し合わせていく
  inner_product += x[i] * y[i]

print(inner_product)
22

このように、\(\displaystyle x \cdot y = 3 \times 4 + 2 \times 5 = 22 \)となる。

numpyでの内積

numpyでは、numpyのdot関数で内積を実装できる。

import numpy as np

# ベクトルx
x = np.array([3, 2])
# ベクトルy
y = np.array([4, 5])

# 内積
inner_product = x.dot(y)

print(inner_product)
22

Pythonで内積の角度を求める

2つのベクトルの角度を内積から求める。

内積 : \(\displaystyle x \cdot y = \vert \vert x \vert \vert \vert \vert y \vert \vert \cos \theta \)

上記の式を変形すると角度\(\displaystyle \theta \)を求めることができる。

\(\displaystyle \cos \theta \ = \frac{x \cdot y}{\vert \vert x \vert \vert \vert \vert y \vert \vert} \)

\(\displaystyle \vert \vert x \vert \vert \vert \vert y \vert \vert \)は、それぞれベクトルxとベクトルyの長さのことで、numpyのnorm関数で求められる。

import numpy as np

# ベクトルx
x = np.array([3, 2])
# ベクトルy
y = np.array([4, 5])

# 角度
theta = x.dot(y) / (np.linalg.norm(x) * np.linalg.norm(y))

print(theta)
0.9529257800132621

数学

記事を読んでいただきありがとうございました。

Page Top