パンダの行列乗算

Olorunfemi Akinlua 2023年6月21日
  1. 行列の乗算
  2. Pandas で DataFrame が整列しているかどうかを確認する
  3. dot 関数を使用して Pandas で行列乗算を実行する
パンダの行列乗算

行列の乗算は、ネットワークの関係、座標系の変換、数値モデリング、在庫計算などを理解するために広く使用されています。 row-column ベースの数値データを使用して、行列の乗算を実行し、その結果を適用可能な領域で使用できます。

Pandas と Numpy には、乗算、反転などの行列の使用と演算を可能にするツールと関数があります。Pandas での行列の乗算は、それを動かす基礎となる数学を知らないと、少し混乱する (そしてエラーにつながる) 可能性があります。

この記事では、パンダで行列乗算を行う方法とエラーを回避する方法について説明します。

行列の乗算

行列の乗算を実行するには、関係する 2つの行列が操作に合わせて (または適切に) 配置されていることを確認する必要があります。 行列には行と列があります。 2つの行列を乗算したい場合、それを可能にするためには列と行の数が重要です。

行列を で表します。たとえば、2 x 4 行列には 2 行と 4 列があります。 このすべての情報で、行列の乗算を可能にするには、最初の行列 (左の行列) の列数が 2 番目の行列 (右の行列) の行数と等しくなければなりません。

したがって、最初の行列には 3 列、2 番目の行列には 3 行あるため、2 x 3 行列は 3 x 2 で乗算できます。 また、3 x 4 行列は 4 x 23 行列で乗算できます。これは、最初の行列の列数が 2 番目の行列の行数 - 4 に等しいためです。

ただし、最初の行列を変更 (または反転) すると、行列の乗算ができなくなる可能性があります。 前と同じ例を使用すると、最初の列の列数が 2 番目の行列の行数に等しいため、3 x 2 行列に 2 x 3 行列を掛けることができます。

2 番目の例では、4 x 23 マトリックスに 3 x 4 マトリックスを掛けることができます。これは、1 番目のマトリックスの列数 (23) が行数 (3) と等しくないためです。 2番目のマトリックスの。

Pandas で DataFrame が整列しているかどうかを確認する

データ フレーム (行列) の形状が行列乗算の規定の規則に適合するかどうかを確認することで、データ フレームが行列演算を実行できるかどうかを確認できます。 これを実現するには、データフレームの shape プロパティ (2つの要素を持つタプル) にアクセスし、最初のデータフレーム (マトリックス) の列の値 (タプル内の 2 番目の値) を行の値 (最初の値) と比較します。 タプル内) 2 番目のデータ フレーム (マトリックス)。

dfother の 2つのデータフレームを作成し、それらの形状を確認して比較しましょう。

コード:

import pandas as pd
import numpy as np

df = pd.DataFrame([[23, 33], [33, 41]])
other = pd.DataFrame([[31, 0], [20, 1]])

print(df)
print(other)

出力:

    0   1
0  23  33
1  33  41

    0  1
0  31  0
1  20  1

それでは、形状を確認して比較し、データフレームが行列乗算計算を実行できるかどうかを確認しましょう。

print(df.shape)
print(other.shape)

if df.shape[1] == other.shape[0]:
    print("DataFrames (matrices) align and therefore matrix multiplication possible.")
else:
    print(
        "DataFrames (matrices) don't align and therefore matrix multiplication not possible."
    )

出力:

(2, 2)
(2, 2)
DataFrames (matrices) align and therefore matrix multiplication is possible.

ご覧のとおり、df の列数が other の行と等しいため、データフレームが整列します。 これで、行列の乗算に設計された関数 dot() を使用できるようになりました。

dot 関数を使用して Pandas で行列乗算を実行する

Pandas と Numpy には、行列の乗算に使用できる dot() 関数があります。 両方を使用して、行列の乗算を実行する方法を紹介します。

前のセクションで作成したデータフレームを使用して、dot() 関数の使用方法を説明できます。 dfother の行列乗算を解いてみましょう。

pandas dot() 関数を使用して、関数が最初のマトリックス (df) に適用され、2 番目のマトリックス (other) が次のように dot() 関数に引数として渡されます。

print(df.dot(other))

出力:

      0   1
0  1373  33
1  1843  41

numpy dot() 関数を使用する場合、2つの引数 (2つの行列) を渡しますが、最初の行列が最初に渡されます。

print(np.dot(df, other))

出力:

[[1373   33]
 [1843   41]]

numpy ライブラリを使用してランダムに作成された別の 2つのデータフレーム df1df2 で作業し、2つの dot() 関数を使用して行列乗算を実行します。

コード:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(3, 3), columns=list("ABC"), index=[1, 2, 3])
df2 = pd.DataFrame(np.random.randn(3, 3), columns=list("ABC"), index=[1, 2, 3])

print(np.dot(df1, df2))
print(df1.dot(df2))

出力:

[[ 1.28220783 -1.36789201  0.16335459]
 [-0.8039172   0.87851003 -0.32282877]
 [ 1.09767978 -0.71870817 -0.23485835]]

-----
...
ValueError: matrices are not aligned

numpy ライブラリを使用した最初の dot() 関数はエラーなしで動作しましたが、pandas ライブラリを使用した 2 番目の dot() 関数は ValueError: matrices are not aligned エラー メッセージを表示しませんでした。

このエラー メッセージの理由は、pandas dot() 関数が実行されると、df1 の列順と df2 が一致しないため、行列の位置合わせがずれます。 Numpy の dot() 関数はあまり機能せず、エラーもありません。

このエラーに対処するには、2 番目のデータフレームのインデックス - df2 を最初のデータフレームの列 - df1 に割り当てて、2つのデータフレームを整列させる必要があります。

コード:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(3, 3), columns=list("ABC"), index=[1, 2, 3])
df2 = pd.DataFrame(np.random.randn(3, 3), columns=list("ABC"), index=[1, 2, 3])

print(np.dot(df1, df2))

df2.index = df1.columns
print(df1.dot(df2))

出力:

[[ 1.28220783 -1.36789201  0.16335459]
 [-0.8039172   0.87851003 -0.32282877]
 [ 1.09767978 -0.71870817 -0.23485835]]

          A         B         C
1  1.282208 -1.367892  0.163355
2 -0.803917  0.878510 -0.322829
3  1.097680 -0.718708 -0.234858

これで、エラーがなくなり、両方の行列乗算の計算が関係なく機能します。

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn