我计划向同事教授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
期望数字数据,如果给出上述代码,则会出错。
答案 0 :(得分:1)
tensordot
有一个使用字符串作为其中一个数组的示例,利用了'a'*3 => 'aaa'
这一事实。但是einsum
无法对字符串做任何事情(编译代码问题)。
前段时间我写过一篇纯粹的蟒蛇作品,它解析了' ij,jk->' string,并设置适当的乘积和计算。这包括额外的调试输出。这可以作为您任务的起点。
https://github.com/hpaulj/numpy-einsum
最新的einsum
做了一些优化,并提供了一些调试帮助。 np.einsum_path
提供了有关该内容的更多信息。
答案 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系统