15

を使用して numpy で tensor dot product を取得しようとしてtensordotいますが、計算を達成するために配列を再形成する方法がわかりません。(一般的に、テンソルの数学はまだ初心者です。)

私は持っている

arr = np.array([[[1, 1, 1],
                [0, 0, 0],
                [2, 2, 2]],

               [[0, 0, 0],
                [4, 4, 4],
                [0, 0, 0]]])

w = [1, 1, 1]

axis=2そして、私はマトリックスを持つように、内積を取りたい

array([[3, 0, 6],
       [0, 12, 0]])

これに対する適切なnumpy構文は何ですか? np.tensordot(arr, [1, 1, 1], axes=2)を上げるようValueErrorです。

4

2 に答える 2

18

削減は と に沿っていaxis=2ます。したがって、では、解決策は次のようになります -arraxis=0wnp.tensordot

np.tensordot(arr,w,axes=([2],[0]))

または、次を使用することもできますnp.einsum-

np.einsum('ijk,k->ij',arr,w)

np.matmulも動作します

np.matmul(arr, w)

実行時テスト -

In [52]: arr = np.random.rand(200,300,300)

In [53]: w = np.random.rand(300)

In [54]: %timeit np.tensordot(arr,w,axes=([2],[0]))
100 loops, best of 3: 8.75 ms per loop

In [55]: %timeit np.einsum('ijk,k->ij',arr,w)
100 loops, best of 3: 9.78 ms per loop

In [56]: %timeit np.matmul(arr, w)
100 loops, best of 3: 9.72 ms per loop

hlin117 は、Macbook Pro OS X El Capitan、numpy バ​​ージョン 1.10.4 でテストされています。

于 2016-03-16T09:09:04.170 に答える
2

使用.dotは私にとってはうまくいきます:

>>> import numpy as np
>>> arr = np.array([[[1, 1, 1],
                     [0, 0, 0],
                     [2, 2, 2]],

                    [[0, 0, 0],
                     [4, 4, 4],
                     [0, 0, 0]]])
>>> arr.dot([1, 1, 1])
array([[ 3,  0,  6],
       [ 0, 12,  0]])

興味深いことに、他のすべての提案よりも遅いですが

于 2016-03-16T16:20:56.880 に答える