生成np.einsum评估图

时间:2017-06-27 12:21:50

标签: python numpy scipy numpy-einsum

我计划向同事教授np.einsum,希望展示如何将它简化为乘法和求和。 所以,我没有使用数字数据,而是使用字母表字符。在阵列中。

说,我们有A(2X2)为[[' a',' b'],[' c',' d&#39 ;]]和B(2X1)为[[' e'],[' f']] 我们可以使用einsum创建一个矩阵C,比如:np.einsum('ab , bc -> ac', A, B)

我希望看到的是:它返回计算图:类似于:a * c + ...等等。

当然,np.einsum期望数字数据,如果给出上述代码,则会出错。

2 个答案:

答案 0 :(得分:1)

tensordot有一个使用字符串作为其中一个数组的示例,利用了'a'*3 => 'aaa'这一事实。但是einsum无法对字符串做任何事情(编译代码问题)。

前段时间我写过一篇纯粹的蟒蛇作品,它解析了' ij,jk->' string,并设置适当的乘积和计算。这包括额外的调试输出。这可以作为您任务的起点。

https://github.com/hpaulj/numpy-einsum

最新的einsum做了一些优化,并提供了一些调试帮助。 np.einsum_path提供了有关该内容的更多信息。

Understanding NumPy's einsum

https://en.wikipedia.org/wiki/Einstein_notation

答案 1 :(得分:0)

首先,为什么你需要B为2-Dim?为什么不只是np.einsum('ab , b -> a', A, B)

现在的实际问题: 它并不完全是您想要的,但通过对A和B使用智能选项,您可以使其可见。例如A = [[1,10],[100,1000]]B = [1,2]np.einsum('ab , b -> a', A, B) = [21,2100]sum(replicate(Var1, 10^((Var2 * runif(1, 0, 1)) + Var3))) ,而且发生的事情非常明显。

更多通用版本有点复杂(但希望不是必需的)。这个想法是使用素数的不同潜力(特别有用的是2和5,因为它们与dezimal系统中易于编号的数字对齐)。如果你想要超过一个维数,你可以考虑采用素数(2,3,5,7等),然后将结果转换为另一个数字系统。 如果你超过两个dims - > 30-ary系统 3个调光(2,3,5,7) - > 210-ary系统