正在生成 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
首先,为什么需要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 进制
我打算教 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
首先,为什么需要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 进制