opqrstuvcut.qrunch.io読者になる5【NumPy】2つの行列のすべての行同士で差を取るときのベストプラクティスPythonNumpy投稿日:2020-01-16最終更新:2020-01-16筆者のブログで記事をみる2つの行列$A$、$B$とあり、$A$の各行と$B$の各行の差の計算をすべての組み合わせでおこないたいことが稀にあります(だいたいRBFカーネルの計算です)。今回は思いつく3つの方法で速度を比較してみました。以下で使われる$A$と$B$は次のように生成しているとします。dim)上記のnとdimですが、次の4つの組み合わせで実験をおこなっています。Proを使っておこなっています。愚直に2重forループ愚直に書くと次のようにforループを2つ使って実現できます。bこのときの速度は以下のようになりました。ブロードキャストを利用よく知られているようにforを繰り返すと計算効率が悪くなります。NumPyのブロードキャストを利用することで、forループを1回減らすことができます。Bこのときの速度は以下のようになりました。6.04sブロードキャストを利用することで全体的に計算速度が向上しました。dim=100のときには4倍以上速くなっています。forループを使わないforループを1回減らすことができるなら、0回にもできるんじゃないかと思いますよね。実は次のようにブロードキャストを上手く利用することで実現できます。dim)reshapeすることで3階のテンソルになっているので複雑なように思えます。最後のdimのサイズのところを無視して考えてみると、$n$次元の列ベクトルと$n$次元の行ベクトルでのブロードキャストと一緒です。このときの速度は以下のようになりました。4.61s計算速度のまとめここまで紹介した方法との比較は以下のとおりです。4.61sどのケースにおいても3の方法が一番速いことがわかります。Qrunch.netサーバー提供フィードバックを送信する。