[英]Python tensor matrix multiply
我有張量
A =
[[[a,b],
[c,d]],
[[e,f],
[g,h]]]
和矩陣
B =
[[1,2],
[3,4]]
我需要得到
C =
[[a*1+e*2,b*1+f*2],
[c*3+g*4,d*3+h*4]]
如何使用矩陣形式的 numpy 來做到這一點? 我已經研究過np.tensordot()
但在這種情況下似乎沒有幫助。
OP 的問題可以使用張量表示法和所謂的愛因斯坦求和約定以標准格式重新表述
A kij Bik ⇒ Cij
Numpy 有一個方便的效用函數來執行可以使用愛因斯坦求和約定描述的那種張量運算, numpy.einsum
,它被命名為numpy.einsum
,它允許通過指令字符串直接將張量符號映射到優化的 C 級循環這完全反映了張量符號, 'kij, ik -> ij'
import numpy as np
a = np.arange(8).reshape(2,2,2)+1
b = np.arange(4).reshape(2,2)+1
c = np.einsum('kij, ik -> ij', a, b)
print(c)
# [[11 14]
# [37 44]]
numpy.einsum
優點
np.einsum
通常很快
In [12]: import numpy as np ...: ...: i, j, k = 100, 320, 140 # just three largish numbers ...: a = np.random.random((k,i,j)) ...: b = np.random.random((i,k)) In [13]: %timeit np.einsum('kij,ik->ij', a, b) 7.47 ms ± 82.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) In [14]: %timeit (a * b[None,:,:].T).sum(axis = 0) 49.3 ms ± 6.77 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
你可以試試這個:
>>> import numpy as np
>>> a = np.arange(1,9).reshape(2,2,2)
>>> a
array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
>>> b = np.arange(1,5).reshape(2,2)
>>> b
array([[1, 2],
[3, 4]])
>>> (a * b[None,:,:].T).sum(axis = 0)
array([[11, 14],
[37, 44]])
中間步驟如下所示:
>>> b[None,:,:]
array([[[1, 2],
[3, 4]]])
>>> b[None,:,:].T
array([[[1],
[3]],
[[2],
[4]]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.