2014-07-04 163 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