如何将以下python代码矢量化?

如何将以下python代码矢量化?,python,arrays,performance,numpy,vectorization,Python,Arrays,Performance,Numpy,Vectorization,我试图使用Numpy和矢量化操作来加快代码部分的运行速度,但没有找到解决方案。如果有人有主意。。。谢谢 以下是循环的工作代码: y = np.zeros(len(tab)) for i in range(len(tab)): s = 0 for n in range(len(coef[0])): s += coef[0][n] * ((a + b * np.dot(tab[i], vectors[n])) ** d) y[i] = s 在哪里, 选项

我试图使用Numpy和矢量化操作来加快代码部分的运行速度,但没有找到解决方案。如果有人有主意。。。谢谢

以下是循环的工作代码:

y = np.zeros(len(tab))
for i in range(len(tab)):
    s =  0
    for n in range(len(coef[0])):
        s += coef[0][n] * ((a + b * np.dot(tab[i], vectors[n])) ** d)
    y[i] = s
在哪里,

  • 选项卡:numpy.array(N,M)
  • 向量:numpy.数组(P,M)
  • coef:numpy.array(1,P)
  • a、 b,c:常数(a=0,如果更容易的话)

    • 看起来很糟糕。但这是你需要的吗

      y = array([ sum( [coef[0][n] * ((a + b * np.dot(tab[i], vectors[n])) ** d) 
                  for n in range(len(vectors[0]))] ) for i in range(len(tab)) ])
      

      您可以使用基于和的方法,如下所示-

      # Calculate "((a + b * np.dot(tab[i], vectors[n])) ** d)" part
      p1 = (a + b*np.einsum('ij,kj->ki',tab,vectors))**d
      
      # Include "+= coef[0][n] *" part to get the final output
      y_vectorized = np.dot(coef,p1)
      

      运行时测试

      数据集#1:

      这是一个快速的运行时测试,将原始的循环方法与建议的方法进行比较,以获得一些随机值-

      In [168]: N = 50
           ...: M = 50
           ...: P = 50
           ...: 
           ...: tab = np.random.rand(N,M)
           ...: vectors = np.random.rand(P,M)
           ...: coef = np.random.rand(1,P)
           ...: 
           ...: a = 3.233
           ...: b = 0.4343
           ...: c = 2.0483
           ...: d = 3
           ...: 
      
      In [169]: %timeit original_approach(tab,vectors,coef,a,b,c,d)
      100 loops, best of 3: 4.18 ms per loop
      
      In [170]: %timeit proposed_approach(tab,vectors,coef,a,b,c,d)
      10000 loops, best of 3: 136 µs per loop
      
      数据集#2:

      N
      M
      p
      分别为
      150
      时,运行时为-

      In [196]: %timeit original_approach(tab,vectors,coef,a,b,c,d)
      10 loops, best of 3: 37.9 ms per loop
      
      In [197]: %timeit proposed_approach(tab,vectors,coef,a,b,c,d)
      1000 loops, best of 3: 1.91 ms per loop
      

      你能在问题的开头用一句话来描述代码应该完成的任务吗?很难给出一个纯粹的程序性评估。@mprat-它是SVM算法实现的一部分,与此实现类似-第83行-88@unutbu-确切地说,我使用相同的数据集更正了代码,我的实现:总运行时间=28分钟,而对于您的实现:总运行时间=15分钟。它更好,但是没有更好的解决方案,不使用这两个循环吗?这不是矢量化,即使使用
      numpy
      来加速循环,仍然有两个
      for
      循环。这只是将2个循环重写为列表理解。仍然是Python循环,只是效率更高一点。