2つのベクトルの内積はnumpy.dotによって計算できます。2つのベクトルの内積のためのスケーラブルな解法
>>> numpy.arange(15).reshape((5, 3))
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
ベクトルが行ベクトルであり、出力はドット積の結果を含む1次元配列でなければならない:
array([ 5, 50, 149, 302, 509])
今はベクトルのアレイのドット積を計算しますクロスプロダクト(numpy.cross)の場合は、axis
キーワードを指定すると簡単に達成できます。しかしnumpy.dot
にはそのようなオプションはなく、2つの2次元配列を渡すと通常の行列積が得られます。私もnumpy.tensordotを見ましたが、これはどちらかの仕事をしていないようです(拡張マトリックス製品です)。
私は、しかし、この解決策は、1次元アレイ(すなわち、ただ1つの要素)に対しては機能しない
>>> numpy.einsum('ij, ji -> i', array2d, array2d.T)
を介して二次元アレイの素子当たりのドット積を計算することができることを知っています。私は、1次元配列(スカラーを返す)と1次元配列(別名2次元配列)の配列(1次元配列を返す)の両方に対応する解を得たいと考えています。
ありがとうございました!私はまた 'numpy.linalg.norm(array、axis = -1)** 2'を使うことができますが、パフォーマンスは'(a * a).sum(axis = -1) 'と似ています。 'einsum')は' einsum'の呼び出しが 'linalg.norm'関数と異なる点(二乗を除いて、しかしこの寄与は無視できると確信しています)を見ていないので、私はかなり驚くべきことです。なぜ2つの機能が異なるパフォーマンスを持つのか考えていますか? ( 'linalg.norm'が' sqrt((a * a).sum(axis = -1)) 'と評価されない限り、' einsum'とは何か異なっていますか?) –
@a_guestまあ、 einsumの実装だが、そのパフォーマンスに基づいて、私はそれがCコンパイルされたコードだと思う。さて、 'numpy.linalg。その性能に基づいてもう一度normを実行すると、私は要素単位の乗算を行い、そのようなコンパイルされたコードの2つの段階が加算され、その上に 'numpy.linalg.norm'があり、sqrtが必要です'einsum'を使って一つのコンパイル済みコードと比較すると、あまりにも多くの作業が必要になります。免責事項:これらに関連するコンパイルの詳細については、専門家ではありません。 – Divakar