【问题标题】:How can I efficiently expand a factored tensor in numpy?如何在 numpy 中有效地扩展因子张量?
【发布时间】:2014-09-06 04:53:39
【问题描述】:

我有一个 3D 张量分解为三个 2D 矩阵,如本文中的方程 22:http://www.iro.umontreal.ca/~memisevr/pubs/pami_relational.pdf

我的问题是,如果我想显式计算张量,在 numpy 中有没有比这更好的方法?

W = np.zeros((100,100,100))
for i in range(100):
    for j in range(100):
        for k in range(100):
            W[i,j,k] = np.sum([wxf[i,f]*wyf[j,f]*wzf[k,f] for f in range(100)]) 

【问题讨论】:

    标签: python performance numpy linear-algebra matrix-multiplication


    【解决方案1】:

    我倾向于使用einsum 来写这些东西,因为它通常是最容易写的:

    def fast(wxf, wyf, wzf):
        return np.einsum('if,jf,kf->ijk', wxf, wyf, wzf)
    
    def slow(wxf, wyf, wzf):
        N = len(wxf)
        W = np.zeros((N, N, N))
        for i in range(N):
            for j in range(N):
                for k in range(N):
                    W[i,j,k] = np.sum([wxf[i,f]*wyf[j,f]*wzf[k,f] for f in range(N)]) 
        return W
    
    def gen_ws(N):
        wxf = np.random.random((N,N))
        wyf = np.random.random((N,N))
        wzf = np.random.random((N,N))
        return wxf, wyf, wzf
    

    给予

    >>> ws = gen_ws(25)
    >>> via_slow = slow(*ws)
    >>> via_fast = fast(*ws)
    >>> np.allclose(via_slow, via_fast)
    True
    

    >>> ws = gen_ws(100)
    >>> %timeit fast(*ws)
    10 loops, best of 3: 91.6 ms per loop
    

    【讨论】:

      【解决方案2】:

      您的示例使使用np.einsum() 提出解决方案变得非常简单:

      W = np.einsum('ij,jf,kf->ijk', wxf, wyf, wzf)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-26
        • 2012-10-24
        • 2011-06-27
        • 2021-07-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多