快速外部张量乘积

发布于 2021-01-29 18:02:11

我有两个numpy数组:

x of shape ((d1,...,d_m)) 
y of shape ((e_1,...e_n))

我想形成外部张量积,即numpy数组

z of shape ((d1,...,d_m,e_1,...,e_n))

这样

z[i_1,...,i_n,i_{n+1}...,i_{m+n}] == x[i_1,...i_m]*y[i_{m+1},...,i_{m+n}]

我必须多次执行上述外部乘法,所以我想尽可能地加快速度。

关注者
0
被浏览
49
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    另一种方法outer是显式扩展尺寸。对于一维数组,这将是

    x[:,None]*y   # y[None,:] is automatic.
    

    对于10x10的数组,并推广维度扩展,我得到了相同的时间

    In [74]: timeit x[[slice(None)]*x.ndim + [None]*y.ndim] * y
    10000 loops, best of 3: 53.6 µs per loop
    
    In [75]: timeit np.multiply.outer(x,y)
    10000 loops, best of 3: 52.6 µs per loop
    

    这样outer确实可以节省一些编码,但是基本的广播乘法是相同的。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看