2014-07-04 210 views
2

我有一個二維陣列A,我在這裏代表[v_1, v_2, v_3, ..., v_n]向量陣列和矩陣陣列之間的成對乘積

我有一個三維張量B,我在這裏代表[m_1, m_2, m_3, ...n m_n]

A.type = numpy.ndarray 

A.shape = (300, 4) 

B.type = numpy.ndarray 

B.shape = (300, 4, 2) 

我想要得到的一維數組C = A*B這樣C = [u_1, u_2, u_3, ..., u_n]其中u_i = np.dot(v_i, m_i)

我怎樣才能做到這一點沒有遍歷1n和使用numpy.tensordot()超過AB

+0

'np.tensordot(A,B,axes = 2)'會返回'C'= [u1 + u2 + u3 + ... + un]'。但是,通過簡單地指定軸,似乎無法獲得所需的「C」。 Yup! – Bakuriu

回答

2

您可以使用np.einsum函數來做到這一點。這可以讓你給出一個字母(索引)給你提供的數組的每個維度作爲一個字符串,並使用愛因斯坦和符號來處理。所以在你的情況下我會這樣說:

np.einsum("ik,ikl->il", A,B) 

所以在這種情況下,我的名字A I,K的尺寸 - > 300,4和B的尺寸必須是I,K還有其他的東西l - > 300,4,2然後用箭頭指定你想要出的尺寸。如果您在箭頭後沒有提供字母(索引),則該維度將被累加。所以如果你完成了「ik,ikl-> l」,那麼它將在300維度上進行總結。

+0

解決了它! :D 非常感謝......我甚至都沒有意識到這個真主! – Bokha