我有下面的函数,我想矢量化,以加快它。该函数接受任意长度的列向量,并且必须输出单个数字。函数是:
xs = np.array([0.3, 5.01, 13.5, -1.01, 66.0, -101.6, 41.44, 111.0, 36.2, 9.0])
def func(xs):
fitness = xs[0]
for i in xs:
if np.abs(i) > fitness:
fitness = np.abs(i - 30)
return fitness
期望输出:131.6
让我们重写函数以更好地可视化操作:
In [221]: xs = np.array([0.3, 5.01, 13.5, -1.01, 66.0, -101.6, 41.44, 11.0, 36.2, 9.0])
...: def func(xs):
...: x1 = np.abs(xs); x2 =np.abs(xs-30)
...: print(x1); print(x2)
...: fitness = x1[0]
...: for i,j in zip(x1,x2):
...: if i > fitness:
...: fitness = j
...: print(fitness)
...: return fitness
...:
In [222]: xs
Out[222]:
array([ 0.3 , 5.01, 13.5 , -1.01, 66. , -101.6 , 41.44,
11. , 36.2 , 9. ])
In [223]: func(xs)
[ 0.3 5.01 13.5 1.01 66. 101.6 41.44 11. 36.2 9. ]
[ 29.7 24.99 16.5 31.01 36. 131.6 11.44 19. 6.2 21. ]
0.3
24.990000000000002
24.990000000000002
24.990000000000002
36.0
131.6
131.6
131.6
131.6
131.6
Out[223]: 131.6
In [224]: x1 = np.abs(xs); x2 =np.abs(xs-30)
所以fitness
的连续值看起来很像x2
的累积最大值:
In [225]: np.maximum.accumulate(x2)
Out[225]:
array([ 29.7 , 29.7 , 29.7 , 31.01, 36. , 131.6 , 131.6 , 131.6 ,
131.6 , 131.6 ])
或者跳过x2
的第一个值:
In [226]: np.maximum.accumulate(x2[1:])
Out[226]:
array([ 24.99, 24.99, 31.01, 36. , 131.6 , 131.6 , 131.6 , 131.6 ,
131.6 ])
这不是一个完美的替代品,但可能会给你/我们一些如何使它更好的想法。