Python 中 numpy einsum 的更快替代方案

问题描述 投票:0回答:1

我正在尝试对一些张量执行以下操作。目前我正在使用 einsum,我想知道是否有一种方法(也许使用 dot 或 tensordot)可以让事情变得更快,因为我觉得我正在做的或多或少是一些外部和内部产品。

res1 = numpy.einsum('ij, kjh->ikjh', A, B)
res2 = np.einsum('ijk, jk->ij', C, D)

我尝试过使用tensordot和dot,由于某种原因,我无法找到设置轴的正确方法......

python numpy tensor tensordot einsum
1个回答
0
投票

np.einsum
对于复杂问题已经很有效了。为了优化它,您可以使用纯 Python 循环或 NumPy 向量化函数进行向量化。或者,
optimal='best'
尝试选择最佳的收缩算法,但它可能有点挑剔。请务必对其进行验证,以确保它为您提供最佳性能。

如果您打算使用其他方法,

np.tensordot
非常适合涉及收缩的操作(通过在指定轴上求和来减少维度)。与
einsum
相比,它可以更好地控制轴规格。您可以将其与
result = np.tensordot(A, B, axes=([axis1, axis2], [axis3, axis4]))

一起使用

或者,如果您的

einsum
运算涉及不带收缩的矩阵乘法(跨特定轴的元素求和),则
np.matmul
可以作为替代方案。您可以将其与
result = np.matmul(A, B)

一起使用

您还可以尝试使用

SciPy
TensorFlow
PyTorch

© www.soinside.com 2019 - 2024. All rights reserved.