在Numpy Array上应用分段函数的有效(速度)方法是什么?
比方说,例如,分段函数就像
For (1) : x<=2 f(x) = 2*x + x^2
(2) : x>2 f(x) = -(x^2 + 2)
这就是我的所作所为。
data = np.random.random_integers(5, size=(5,6))
print data
np.piecewise(data, [data <= 2, data > 2],
[lambda x: 2*x + pow(2, x),
lambda x: -(pow(x, 2) + 2)])
data =
[[4 2 1 1 5 3]
[4 3 3 5 4 5]
[3 2 4 2 5 3]
[2 5 4 3 1 4]
[5 3 3 5 5 5]]
output =
array([[-18, 8, 4, 4, -27, -11],
[-18, -11, -11, -27, -18, -27],
[-11, 8, -18, 8, -27, -11],
[ 8, -27, -18, -11, 4, -18],
[-27, -11, -11, -27, -27, -27]])
对于较小的数组,大型数组,许多函数等,是否有一种有效的方法?我担心的是使用lambda函数。不确定这些是否是Numpy优化的。
答案 0 :(得分:3)
在这种情况下,您不应该关注lambdas:Numpy优化是关于通过让函数在批处理中同时评估许多值来减少调用开销。在每次调用np.piecewise
时,funclist
(函数部分)中的每个函数都只调用一次,其中numpy数组由适当条件为真的所有值组成。因此,这些lambda是以numpy优化的方式调用的。
类似的是np.select
(和np.where
正好两部分)。调用开销与以相同方式进行矢量化相同,但它将评估所有数据点的所有函数。因此,它将比np.piecewise
慢,特别是当功能昂贵时。在某些情况下,更方便(没有lambda),并且可以更容易地将概念扩展到许多变量。