検索
連載

Pythonで線形代数!〜行列編(基礎・後編)数学×Pythonプログラミング入門(2/4 ページ)

AI/機械学習で使われるデータを表現するためにはベクトルや行列などの線形代数を理解することが必要不可欠。今回は行列の内積の計算方法とその応用について、プログラミングの方法を初歩から見ていく。

Share
Tweet
LINE
Hatena

目標2: 二次元配列での@演算子、dot関数、inner関数の違いを確認する

 この連載の第9回(ベクトル編)ではinner関数を使っても内積が求められるが、配列の計算の場合は結果が異なるという話をしました。また、既に少し触れたように、二次元までの配列であれば、@演算子とdot関数の働きは同じですが、三次元以上の配列の場合は働きが異なります。ちょっと整理してみましょう。

  • ベクトルの内積や配列とベクトルの内積: @演算子、dot関数、inner関数の働きは全て同じ
  • 二次元の配列の内積: @演算子とdot演算子の働きは同じだが、inner関数の働きは異なる ← ここではこれを見る
  • 三次元以上の配列の内積: 全て働きが異なる ← これは目標3で見る

 まずは、二次元の配列での動作を具体的に確認してみましょう。というわけで、目標2です。2×2の配列を作成し、@演算子とinner関数による計算の結果に違いが出るような具体例を1つ挙げてみてください。配列の要素の値はどんな値でも構いません。

2. 二次元配列で@演算子、dot関数、inner関数の違いを確認するためのコードを書く

 適当に数字を選んでやってみれば、たいていの場合、@演算子とdot関数の働きが同じで、inner関数の働きが異なることが分かります。転置(=配列の行と列を入れ替えること)しても同じ配列になる例では、結果に違いが見られませんが、リスト4のような配列であれば違いが分かります。

import numpy as np

A = np.array([[1, 2],
              [3, 4]])
B = np.array([[-2, 3],
              [1, 5]])

print(A @ B)
print(np.inner(A, B))
# 出力例:
# [[ 0 13]
#  [-2 29]] # @演算子での結果(dot関数でも同じ)
# [[ 4 11]
#  [ 6 23]] # inner関数での結果

リスト4 dot関数とinner関数の違い
@演算子やdot関数ではこれまでに見た計算方法で内積が求められるが、inner関数では違った結果になる。inner関数の場合、配列Bの最後の軸に沿って(列番号が変わる方向に=右に向かって)積和が求められる。

 inner関数での計算は以下のように行われます。

のとき、

 @演算子やdot関数では、Aの行とBの列の積和を求めていましたが、inner関数では、Aの行とBの行の積和を求めていることが分かります。ちなみに、Bを転置して、np.inner(A, B.T)とすれば、A@Bと同じ結果になります。.Tは転置した(全ての軸を逆順にした)配列を返す属性です。

Copyright© Digital Advantage Corp. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る