实现点积和的numpy爱因斯坦求和

时间:2020-01-21 22:20:16

标签: python numpy numpy-ndarray numpy-einsum numpy-ufunc

我需要优化一个算法,该算法需要尽可能快,目前,它是2个向量的点积问题的基本和,但是我认为我的解决方案有点多余,并且爱因斯坦表示法可以获得很多更快的结果。首先,我有一个价值案例:

for t in range(2):
  for i2 in range(40):
     for j2 in range(40):
       U_out[i2,j2,t] += np.sum(np.multiply(U_in[:,:,t],constants[:,:,j2,i2,t]))

我需要连续使用8次,所以我想出了另一个野蛮的解决方案:

for t in range(2):
  for i2 in range(40):
    for j2 in range(40):
      U_out[i2,j2,t,0] += np.sum(np.multiply(U_in[:,:,t,0],constants[:,:,j2,i2,t]))
      U_out[i2,j2,t,1] += np.sum(np.multiply(U_in[:,:,t,1],constants[:,:,j2,i2,t]))
      U_out[i2,j2,t,2] += np.sum(np.multiply(U_in[:,:,t,2],constants[:,:,j2,i2,t]))
      U_out[i2,j2,t,3] += np.sum(np.multiply(U_in[:,:,t,3],constants[:,:,j2,i2,t]))
      U_out[i2,j2,t,4] += np.sum(np.multiply(U_in[:,:,t,4],constants[:,:,j2,i2,t]))
      U_out[i2,j2,t,5] += np.sum(np.multiply(U_in[:,:,t,5],constants[:,:,j2,i2,t]))
      U_out[i2,j2,t,6] += np.sum(np.multiply(U_in[:,:,t,6],constants[:,:,j2,i2,t]))
      U_out[i2,j2,t,7] += np.sum(np.multiply(U_in[:,:,t,7],constants[:,:,j2,i2,t]))

现在,第一个代码重复8次大约是一秒钟,而第二个代码需要0.4秒。但是,我将在优化AI算法中使用它们,因此它将以这种形式循环运行数周。可变形状为:

U_out = (40,40,2) 1st code , (40,40,2,8) 2nd code 
U_in  = (40,40,2) 1st code , (40,40,2,8) 2nd code 
constants = (40,40,40,40,2) for both codes

任何帮助,甚至没有爱因斯坦表示法,但是将第二代码的总和减少到如上所述的4行将对我有很大帮助。

0 个答案:

没有答案