猿问

numpys张量点的向量化计算

我有两个向量,分别包含形状(3,3)和形状张量(3,3,3,3)。这些向量具有相同的长度,我正在计算这两个向量的逐元素张量点。例如,想要对以下计算进行矢量化以提高性能:


a = np.arange(9.).reshape(3,3)

b = np.arange(81.).reshape(3,3,3,3)

c = np.tensordot(a,b)


a_vec = np.asanyarray([a,a])

b_vec = np.asanyarray([b,b])    

c_vec = np.empty(a_vec.shape)


for i in range(c_vec.shape[0]):

    c_vec[i, :, :] = np.tensordot(a_vec[i,:,:], b_vec[i,:,:,:,:])


print(np.allclose(c_vec[0], c))

# True

我考虑过使用numpy.einsum但无法找出正确的下标。我尝试了很多不同的方法,但到目前为止都失败了:


# I am trying something like this

c_vec = np.einsum("ijk, ilmno -> ijo", a_vec, b_vec)


print(np.allclose(c_vec[0], c))

# False

但这并不能重现我上面想要的迭代计算。如果使用 einsum 无法完成此操作,或者有更高效的方法可以完成此操作,我愿意接受任何类型的解决方案。


精慕HU
浏览 191回答 2
2回答

慕婉清6462132

矢量化方式np.einsum是 -c_vec = np.einsum('ijk,ijklm->ilm',a_vec,b_vec)

千万里不及你

tensor_dot有一个axes你也可以使用的参数:c_vec = np.tensordot(a_vec, b_vec, axes=([1, 2], [1, 2]))
随时随地看视频慕课网APP

相关分类

Python
我要回答