【问题标题】:Multilinear maps in python using numpypython中使用numpy的多线性映射
【发布时间】:2016-07-16 17:18:34
【问题描述】:

在 python 中,我有一个大小为(n,n,n) 的三维数组T 和一个大小为(n,k) 的二维数组。

在线性代数中,由T 定义并应用于W 的多线性映射在代码中为:

X3 = np.zeros((k,k,k))
    for i in xrange(k):
       for j in xrange(k):
            for t in xrange(k):
               for l in xrange(n):
                 for m in xrange(n)
                    for h in xrange(n):
                        X3[i, j, t] += M3[l, m, h] * W[l, i] * W[m, j] * W[h, t]

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

供参考。

这很慢。我想知道 numpy 中是否存在任何替代或任何预构建功能可以加快操作速度。

【问题讨论】:

  • 你的典型nk是什么?
  • n 可以很大(最多 100000)k 最多 1000,或多或少..
  • 那么,您将有一个形状为(100000,100000,100000) 的数组M3 作为输入?是不是太大而无法放入 RAM 中?
  • @UlderiqueDemoitre 如果以下任何答案解决了您的问题,请单击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。

标签: python arrays performance numpy


【解决方案1】:

这是一种使用一系列点积的方法 -

# Get partial products and thus reach to final output
p1 = np.tensordot(W,M3,axes=(0,0))
p2 = np.tensordot(p1,W,axes=(1,0))
X3out = np.tensordot(p2,W,axes=(1,0))

【讨论】:

    【解决方案2】:

    爱因斯坦求和约定?使用np.einsum

    X3 = np.einsum('lmh,li,mj,ht->ijt', M3, W, W, W)
    

    编辑:

    出于好奇,我刚刚运行了一些基准测试,将 np.einsum 与 Divakar 的方法进行了比较。与np.einsum的区别很大!

    import numpy as np
    
    def approach1(a, b):
        x = np.einsum('lmh,li,mj,ht->ijt', a, b, b, b)
    
    def approach2(a, b):
        p1 = np.tensordot(b, a, axes=(0,0))
        p2 = np.tensordot(p1, b, axes=(1,0))
        x = np.tensordot(p2, b, axes=(1,0))
    
    n = 100
    k = 10
    a = np.random.random((n, n, n))
    b = np.random.random((n, k))
    %timeit approach1(a, b)      # => 1 loop, best of 3: 26 s per loop
    %timeit approach2(a, b)      # => 100 loops, best of 3: 4.23 ms per loop
    

    this question 对此进行了一些讨论。这一切似乎都归结为np.einsum 试图实现的普遍性——以能够将计算卸载到低级线性代数包为代价。

    【讨论】:

    • 对不起,为了性能和简洁,我对我的帖子进行了编辑以避免交换轴。你能更新时间测试吗?我并不期待巨大的变化,但主要与适当的帖子有关。谢谢!
    • @Divakar:完成!与您之前的代码相差 10 倍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多