是否可以对以下函数进行矢量化?



我有下面的函数,我想矢量化,以加快它。该函数接受任意长度的列向量,并且必须输出单个数字。函数是:

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 ])

这不是一个完美的替代品,但可能会给你/我们一些如何使它更好的想法。

相关内容

最新更新