我有两个numpy数组:
一个1D数组,称为t形(70L),元素名为let s say ti
一个称为I的3D数组,具有形状(70L、1024L、1024L),每个元素称为Ii因此具有尺寸(1024L,1024L)
我想做一个沿第一维的两个数组的乘积,即:

tI = t1*I1,t2*I2,...,tN*IN

例如,为了再次获得一个新的维度数组(70L,1024L,1024L),然后沿着第一维度取和,以便获得一个维度数组(1024L,1024L):
tsum = t1*I1 + t2*I2 + ... +tN*IN

目前,我对以下工作感到满意:
tI = np.asarray([t[i]*I[i,:,:] for i in range(t.shape[0])])
tsum = np.sum(tI,axis=0)

但如果我的阵列尺寸在增加的话会有点慢。
我想知道是否存在一个NUMPY或SISPY函数,对于那个特定的任务更优化?
提前感谢任何链接或信息。
格雷格

最佳答案

您可以使用np.tensordot。-

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

您也可以使用np.einsum。-
np.einsum('i,ijk->jk',t,I)

运行时测试和输出验证-
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

关于python - 一维1D阵列和3D阵列的高效乘积-NumPy,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36150339/

10-09 03:14