我有数组e
,(形q
l
)f
(n
形状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()
的所有行上广播。
最后,我需要使用w
和M
的元素来创建矩阵F
,其中A
。这也看起来是内部产品,但是采取大量单独的反转是耗时的,那么有没有办法计算切片的反转,而不是循环?
我的数组中的一些测试值如下:
A[s,i] = np.sum(np.linalg.inv(M[s, :, :])[i, :] * F[i, :])
答案 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)。但是我对这些问题很生疏。另请检查tensorsolve
和tensorinv
。