Numpy:如何在张量上正确执行点积
Numpy: How to properly perform dot products over tensors
假设我不想在某个域上绘制二维高斯函数
A=1,其中 sigma 是 2x2 矩阵,x, mu 二维向量:
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]])
我有一个形状为 (2, size, size)
的 x
,我想要一个形状为 (size, size)
的结果矩阵 r
,其中每个条目 r[i,j]
对应于 f(x[:,i,j])
.
我的第一次尝试是 np.vectorize
该函数,但如果不单独处理 meshgrid 的矩阵,它并不是微不足道的,而且我读过矢量化函数并不是性能方面的最佳解决方案。然后我发现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.einsum
是一个选项:
np.einsum('jki,il,jkl->jk', cent, sigma, cent)
假设我不想在某个域上绘制二维高斯函数
A=1,其中 sigma 是 2x2 矩阵,x, mu 二维向量:
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]])
我有一个形状为 (2, size, size)
的 x
,我想要一个形状为 (size, size)
的结果矩阵 r
,其中每个条目 r[i,j]
对应于 f(x[:,i,j])
.
我的第一次尝试是 np.vectorize
该函数,但如果不单独处理 meshgrid 的矩阵,它并不是微不足道的,而且我读过矢量化函数并不是性能方面的最佳解决方案。然后我发现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.einsum
是一个选项:
np.einsum('jki,il,jkl->jk', cent, sigma, cent)