違いは何ですか
import numpy as np
np.dot(a,b)
と
import numpy as np
np.inner(a,b)
私が試したすべての例は、同じ結果を返しました。ウィキペディアには両方の同じ記事がありますか?! 説明ではinner()
、その動作は高次元で異なると書かれていますが、異なる出力を生成できませんでした。どちらを使用する必要がありますか?
2 次元配列の場合は行列の乗算に相当し、1 次元配列の場合はベクトルの内積 (複素共役なし) に相当します。N 次元の場合、これは a の最後の軸とbの最後から 2 番目の軸の合計です。
1 次元配列 (複素共役なし) のベクトルの通常の内積。高次元では、最後の軸の合計積。
(私のものを強調してください。)
例として、2D 配列を使用した次の例を考えてみましょう。
>>> a=np.array([[1,2],[3,4]])
>>> b=np.array([[11,12],[13,14]])
>>> np.dot(a,b)
array([[37, 40],
[85, 92]])
>>> np.inner(a,b)
array([[35, 41],
[81, 95]])
したがって、使用する必要があるのは、アプリケーションに正しい動作を与えるものです。
性能試験
(同じ結果が得られる唯一の状況.dot
であるため、1D ケースのみをテストしていることに注意してください。).inner
>>> import timeit
>>> setup = 'import numpy as np; a=np.random.random(1000); b = np.random.random(1000)'
>>> [timeit.timeit('np.dot(a,b)',setup,number=1000000) for _ in range(3)]
[2.6920320987701416, 2.676928997039795, 2.633111000061035]
>>> [timeit.timeit('np.inner(a,b)',setup,number=1000000) for _ in range(3)]
[2.588860034942627, 2.5845699310302734, 2.6556360721588135]
たぶん.inner
速いかもしれませんが、私のマシンは現時点でかなり負荷がかかっているため、タイミングは一貫しておらず、必ずしも正確でもありません.
np.dot
とnp.inner
は 1 次元配列で同一であるため、おそらく違いに気付かないのはそのためです。N 次元配列の場合、それらは一般的なテンソル演算に対応します。
np.inner
は、高次テンソルと低次テンソルの間の「ベクトル積」と呼ばれることがあり、特にテンソルにベクトルを掛けたものであり、しばしば「テンソル収縮」につながります。これには、行列とベクトルの乗算が含まれます。
np.dot
「テンソル積」に対応し、Wikipedia ページの下部に記載されているケースが含まれます。これは一般に、2 つの類似したテンソルを乗算して新しいテンソルを生成するために使用されます。これには、行列間の乗算が含まれます。
テンソルを使用していない場合は、これらのケースについて心配する必要はなく、同じように動作します。
高次元空間では、内積とドット積の間には多くの違いがあります。以下は、2x2 行列と 3x2 行列の例です x = [[a1,b1],[c1,d1]] y= [[a2,b2].[c2,d2],[e2,f2]
np.inner(x,y)
出力 = [[a1xa2+b1xb2 ,a1xc2+b1xd2, a1xe2+b1f2],[c1xa2+d1xb2, c1xc2+d1xd2, c1xe2+d1xf2]]
ただし、内積の場合、2x2 行列を 3x2 で乗算できないため、出力に以下のエラーが表示されます。
ValueError: 形状 (2,2) と (3,2) が整列していません: 2 (dim 1) != 3 (dim 0)