【发布时间】:2020-10-17 13:33:51
【问题描述】:
我正在寻找解决以下问题的最有效方法的建议:
我有两个名为 A 和 B 的数组。它们的形状都是 NxNx3。它们代表两个二维位置矩阵,其中每个位置是 x、y 和 z 坐标的向量。
我想创建一个新的数组,称为 C,形状为 NxN,其中 C[i, j] 是向量 A[i, j] 和 B[i, j] 的点积。
这是我迄今为止提出的解决方案。第一个使用 numpy 的 einsum 函数 (which is beautifully described here)。第二个使用 numpy 的广播规则及其 sum 函数。
>>> import numpy as np
>>> A = np.random.randint(0, 10, (100, 100, 3))
>>> B = np.random.randint(0, 10, (100, 100, 3))
>>> C = np.einsum("ijk,ijk->ij", A, B)
>>> D = np.sum(A * B, axis=2)
>>> np.allclose(C, D)
True
有没有更快的方法?我听说过 numpy 的 tensordot 函数可能非常快,但我一直很难理解它。使用 numpy 的点或内部函数怎么样?
在某些情况下,A 和 B 数组通常包含 100 到 1000 个元素。
非常感谢任何指导!
【问题讨论】:
-
带有 optimize=True/"greedy"/"optimize" 的 Einsum 在某些情况下只是 tensordot 的包装器。示例:stackoverflow.com/a/62415935/4045774 但这个问题是不可能的(一个 BLAS 调用来完成所有计算)。