【问题标题】:Numpy: How to properly perform dot products over tensorsNumpy:如何在张量上正确执行点积
【发布时间】:2018-12-05 03:40:44
【问题描述】:

假设我不想在某个域上绘制二维高斯函数

其中 A=1,其中 sigma 是一个 2x2 矩阵和 x, mu 2 维向量:

base = np.linspace(-1, 1, size)
x = np.array(np.meshgrid(base, base))
mu = np.array([x_0, x_1])
sigma = np.array([[a, b],
                  [b, c]])

我有一个x,其形状为(2, size, size),我想要一个形状为(size, size) 的结果矩阵r,其中每个条目r[i,j] 对应于f(x[:,i,j])

我的第一次尝试是 np.vectorize 该函数,但如果不单独处理网格网格的矩阵,这并非易事,而且我读过矢量化函数并不是性能方面的最佳解决方案。然后我找到了np.tensordot,但是在做

cent = x.T - mu
np.tensordot(cent, np.tensordot(sigma, cent, axes=[0, 2]), axes=[2, 0]).shape

产生(size, size, size, size) 形状,所以有些地方我做错了。

如何将这样的矢量计算应用于张量结构?

【问题讨论】:

  • np.vectorize 在这里不好;它将标量值传递给您的函数。您想传递 1 或 2d 数组。在这里,您正在做dot 产品,ij 维度为'going-along-for-the-ride'。 tensordot 做的不对。 matmul (@) 可以,但einsum 更容易正确调用。

标签: python numpy linear-algebra gaussian tensor


【解决方案1】:

np.einsum 是一种选择:

np.einsum('jki,il,jkl->jk', cent, sigma, cent)

【讨论】:

  • 你能解释一下einsum在做什么吗?通过阅读文档,我无法获得太多信息。
  • Ir 本质上是指 result_jk = sum_il cent_jki sigma_il cent_jkl 。它与Einstein's convention 类似,将出现在多个参数中但未出现在结果中的索引相加。
  • 我读到的方式是jk 尺寸对应于您的[i,j],即您试图“矢量化”的外部尺寸。 i 是第一个 dot(求和)维度(第 1 个最后一个,第 2 个到第 2 个最后一个),l 是第二个“点”维度。
猜你喜欢
  • 2016-07-04
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 2021-07-19
  • 2021-04-24
相关资源
最近更新 更多