【问题标题】:Generating np.einsum evaluation graph生成 np.einsum 评估图
【发布时间】:2017-06-27 12:21:49
【问题描述】:

我计划向同事教授np.einsum,希望展示如何将其简化为乘法和求和。 所以,我想用字母字符代替数字数据。在数组中。

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

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

当然,np.einsum 需要数字数据,如果运行上面的代码会报错。

【问题讨论】:

    标签: python numpy scipy numpy-einsum


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      首先,为什么需要 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],很明显发生了什么。

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

      【讨论】:

        猜你喜欢
        • 2017-10-20
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        • 2020-03-24
        • 1970-01-01
        • 2010-12-10
        • 2016-08-14
        • 2012-03-06
        相关资源
        最近更新 更多