numpy:广播成多个内部产品和反转

时间:2016-07-01 03:14:43

标签: python numpy matrix-inverse broadcasting inner-product

我有数组e,(形q lfn形状l)和{{1} } {形状w n},我想创建一个数组l,其中M和数组M[s,i,j] = np.sum(w[s, :] * e[i, :] * e[j, :]),其中F }。

例如,通过循环遍历F[s,j] = np.sum(w[s, :] * f[s, :] * e[j, :])的元素,两者都很容易实现,但我希望更高效(我的实际数据类似于长度为5k的1M条目)。对于M,我可以使用F(我验证后会产生与循环相同的答案)。 F = np.inner(w * f, e)更难,所以第一步是使用列表推导循环维度零,说M(我已经验证了这也与循环一样)。 M = np.stack([np.inner(r[:] * e, e) for r in w])不接受任何轴参数,所以我不清楚如何告诉数组只在np.inner()的所有行上广播。

最后,我需要使用wM的元素来创建矩阵F,其中A。这也看起来是内部产品,但是采取大量单独的反转是耗时的,那么有没有办法计算切片的反转,而不是循环?

我的数组中的一些测试值如下:

A[s,i] = np.sum(np.linalg.inv(M[s, :, :])[i, :] * F[i, :])

1 个答案:

答案 0 :(得分:3)

M[s,i,j] = np.sum(w[s, :] * e[i, :] * e[j, :])

转换为

M = np.einsum('sk,ik,jk->sij',w,e,e)

F[s,j] = np.sum(w[s, :] * f[s, :] * e[j, :])
F = np.einsum('sk,sk,jk->sj', w, f, e)

我没有用你的样品测试这些,但翻译很简单。

对于真正的大型数组,您可能需要将表达式分解为多个部分。使用4个迭代变量,整个迭代空间可能非常大。但首先看看这些表达式是否适用于适度大小的数组。

至于

A[s,i] = np.sum(np.linalg.inv(M[s, :, :])[i, :] * F[i, :])

我看起来np.linalg.inv(M)有效,执行s i x i inverses

如果是,那么

 IM = np.linalg.inv(M)
 A = np.einsum('skm,ik,im->si', IM, F)

我在这里猜得更多。

同样,尺寸可能会变得太大,但首先要小一点。

通常推荐线性方程解决方案而非直接反转,如

  A = F/M
  A = np.linalg.solve(M, F)

因为您可能希望A使M@A=F(@ matrix product)。但是我对这些问题很生疏。另请检查tensorsolvetensorinv