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でベクトルの外積を求める方法です。

Python初心者におすすめのプログラミングスクール

「未経験からでもPythonを学べるプログラミングスクールを探しているけど、色々ありすぎてわからない」なら、次の3つのプログラミングスクールから選んでおけば間違いはありません。

Aidemy Premium:全くの初心者ができるだけ効率よく短期間で実務的に活躍できるAI人材になることを目的とした講座。キャリアカウンセリングや転職エージェントの紹介などの転職支援も充実しており、受講者の転職成功率が高い。

AIジョブカレPythonの基本をおさえた人が、実際に機械学習やディープラーニングを活用できるようになるための講座。転職補償型があるなどキャリア支援の内容が非常に手厚く、講師の質も最高クラス。コスパ最高。Python初心者用の対策講座もある。

データミックスプログラミング経験者のビジネスマンが、更なるキャリアアップのためにデータの処理方法を学んでデータサイエンティストになるための講座。転職だけでなく起業やフリーランスとして独立する人も多い。Python初心者用の対策講座もある。

特に、あなたが以下のような目標を持っているなら、この中から選んでおけば間違いはないでしょう。

・未経験からPythonエンジニアとして就職・転職したい
・AIエンジニアやデータサイエンティストとしてキャリアアップしたい
・起業やフリーランスを視野に入れたい

理由は「Python初心者のためのおすすめプログラミングスクール3選」で解説しています。



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

この記事を書いた人

コメント

コメントする

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

目次
閉じる