正在生成 np.einsum 评估图

Generating np.einsum evaluation graph

我打算教 np.einsum 给同事,希望展示如何将其简化为乘法和求和。 因此,我想使用字母字符而不是数字数据。在数组中。

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

我想看到的是:它 return 计算图:类似于:a*c + ...,等等

当然,np.einsum 需要数值数据,如果将上述代码提供给 运行,就会报错。

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

前段时间我写了一个纯python 类似的工作,它解析'ij,jk->' 字符串,并设置适当的积和计算。这包括额外的调试输出。这可以作为您任务的起点。

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

最新的 einsum 进行了一些优化,并提供了一些调试帮助。 np.einsum_path 提供了更多相关信息。

Understanding NumPy's einsum

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

首先,为什么需要B是2维的?为什么不只是 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],很明显发生了什么。

更通用的版本有点复杂(但希望不是必需的)。这个想法是使用不同的质数势(特别有用的是 2 和 5,因为它们与 dezimal 系统中容易准备的数字对齐)。如果您想对多个维度求和,您可以考虑取质数(2、3、5、7 等),然后将结果转换为另一个数字系统。 如果你总结了两个 dims-> 30 元系统 3 dims (2,3,5,7)-> 210 进制