Efficient product of 1D array and 3D array along one dimension - NumPy

后端 未结 2 1172
伪装坚强ぢ
伪装坚强ぢ 2021-01-21 05:32

I have two numpy arrays:

  • A 1D array called t of shape (70L,) with element called let s say ti
  • A 3D array called I with shape (70L, 1024L, 1024L), with ea
相关标签:
2条回答
  • 2021-01-21 06:04

    You can use np.tensordot -

    np.tensordot(t,I, axes=([0],[0]))
    

    You can also use np.einsum -

    np.einsum('i,ijk->jk',t,I)
    

    Runtime test and output verification -

    In [21]: def original_app(t,I):
        ...:     tI = np.asarray([t[i]*I[i,:,:] for i in range(t.shape[0])])
        ...:     tsum = np.sum(tI,axis=0)
        ...:     return tsum
        ...: 
    
    In [22]: # Inputs with random elements
        ...: t = np.random.rand(70,)
        ...: I = np.random.rand(70,1024,1024)
        ...: 
    
    In [23]: np.allclose(original_app(t,I),np.tensordot(t,I, axes=([0],[0])))
    Out[23]: True
    
    In [24]: np.allclose(original_app(t,I),np.einsum('i,ijk->jk',t,I))
    Out[24]: True
    
    In [25]: %timeit np.tensordot(t,I, axes=([0],[0]))
    1 loops, best of 3: 110 ms per loop
    
    In [26]: %timeit np.einsum('i,ijk->jk',t,I)
    1 loops, best of 3: 201 ms per loop
    
    0 讨论(0)
  • 2021-01-21 06:18

    Divakar gives the best (most efficient) answers. For completeness' sake, one other way of doing it is by using Numpy's broadcasting capabilities:

    (t[:,np.newaxis,np.newaxis]*I).sum(axis=0)
    

    By adding two axes to t, broadcasting becomes possible and one can use regular Numpy operations, which for some might be more readable.

    0 讨论(0)
提交回复
热议问题