NumPyで外積を取得する方法 – numpy.crossの使い方

目次

1. ベクトルの外積とは

まずはベクトルの外積について軽くおさらいしておきましょう。これは2つのベクトルが作る平行四辺形に対して垂直な方向に伸びるベクトルのことです。そして、ベクトルの外積の長さは、平行四辺形の面積と等しくなります。以下のアニメーションでご確認ください。

ベクトルの外積とは何か?幾何学的な意味と計算方法の徹底解説』で詳しく解説しているので、ぜひご確認ください。

なお計算方法は以下の通りです。

ベクトルの外積の求め方

\[
\vec{v}\times\vec{w}=
\left[ \begin{array}{cc} v_1 \\ v_2 \\ v_3 \end{array} \right]
\times
\left[ \begin{array}{cc} w_1 \\ w_2 \\ w_3 \end{array} \right]
=
\left[ \begin{array}{cc}
v_2w_3-w_2v_3 \\
-v_1w_3+w_1v_3 \\
v_1w_2-w_1v_2
\end{array} \right]
\]

PythonではNumPyのnumpy.cross関数を使うことで、簡単にベクトルの外積を求めることができます。

2. numpy.cross の使い方

numpy.cross の書き方は以下の通りです。

numpy.cross

書き方

np.cross(a ,b, axisa=-1, axisb=-1, axisc=-1, axis=None)

パラメーター

引数 解説
a   array_like     1つ目のベクトルを入力します。
b   array_like  2つ目のベクトルを入力します。
axisa*   int  文中で解説します。
axisb* int
axisc* int
axis* int
* はオプション引数であることを示します。

公式ドキュメント:numpy.cross

それではサンプルコードを見て確認していきましょう。

2.1. ベクトルの外積を求める

2つの3次元ベクトルを入力すると、その外積を返します。

In [1]:
import numpy as np
v=np.array([1,2,1])
w=np.array([-1,3,0])
np.cross(v, w)
Out[1]:
array([-3, -1,  5])

一方が2次元ベクトルの場合は、その2次元ベクトルのz軸成分を0として計算します。

In [2]:
# 一方が2次元の場合はz軸を0として計算
v=np.array([1,2,1])
w=np.array([-1,3])
np.cross(v, w)
Out[2]:
array([-3, -1,  5])

2.2. 平行四辺形の面積を求める

両方とも2次元ベクトルの場合は、その2つのベクトルが作る平行四辺形の面積を返します。

In [3]:
# 両方2次元ベクトルの場合は面積を計算
v=np.array([1,2])
w=np.array([-1,3])
np.cross(v, w)
Out[3]:
array(5)

2.3. 複数のベクトルの外積を一括取得

以下のように書くと、それぞれの列ベクトル同士の外積を返します。

In [1]:
import numpy as np
v=np.array([[1,2,3],[4,5,6],[7,8,9]])
w=np.array([[4,5,6],[3,2,1],[9,8,7]])
np.cross(v, w)
Out[1]:
array([[ -3,   6,  -3],
       [ -7,  14,  -7],
       [-16,  32, -16]])

これらは具体的には、次の計算結果を返しています。

\[
\left[ \begin{array}{cc} 1 \\ 2 \\3 \end{array} \right]
\times
\left[ \begin{array}{cc} 4 \\ 5 \\6 \end{array} \right]
=
\left[ \begin{array}{cc} -3 \\ 6 \\ -3 \end{array} \right],
\hspace{7mm}
\left[ \begin{array}{cc} 4 \\ 5 \\ 6 \end{array} \right]
\times
\left[ \begin{array}{cc} 3 \\ 2 \\1 \end{array} \right]
=
\left[ \begin{array}{cc} -7 \\ 14 \\ -7 \end{array} \right],
\hspace{7mm}
\left[ \begin{array}{cc} 7 \\ 8 \\9 \end{array} \right]
\times
\left[ \begin{array}{cc} 9 \\ 8 \\7 \end{array} \right]
=
\left[ \begin{array}{cc} -16 \\ 32 \\ -16 \end{array} \right]
\]

このように列ベクトル同士の外積を返しますが、オプション引数 axisa, axisbを使うと、行ベクトル同士の外積や、一方の列ベクトルと他方の行ベクトルの外積というように求める対象を指定することができます。

axisa では先に入力した配列の軸を、axisb では後で入力した配列の軸を指定します。以下は行ベクトル同士の外積を取得します。

In [2]:
np.cross(v, w, axisa=0, axisb=0)
Out[2]:
array([[ 15,  19, -13],
       [ 24,  24, -21],
       [ 33,  33, -33]])

2つのベクトルの軸を一括で指定したい場合は、オプション引数 axis を使います。

In [3]:
np.cross(v, w, axis=0)
Out[3]:
array([[ 15,  24,  33],
       [ 19,  24,  33],
       [-13, -21, -33]])

オプション引数 axisc はベクトルの外積を、行ベクトルとして出力するのか、列ベクトルとして出力するのかを指定するものです。

In [4]:
np.cross(v, w, axis=0, axisc=0)
Out[4]:
array([[ 15,  24,  33],
       [ 19,  24,  33],
       [-13, -21, -33]])

3. まとめ

以上がNumPyでベクトルの外積を求める方法です。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる