我正在尝试使用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
其中,
答案 0 :(得分:4)
您可以使用基于np.einsum
和matrix-multiplication with np.dot
的方法,如下所示 -
# 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
答案 1 :(得分: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)) ])