5

在 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 优化。

4

1 回答 1

4

在这种情况下,您不应该担心 lambda:Numpy 优化是通过让函数同时批量评估许多值来减少调用开销。在对 的每次调用中np.piecewise,(函数部分)中的每个函数funclist只被调用一次,其中一个 numpy 数组由适当条件为真的所有值组成。因此,这些 lambda 以 numpy 优化的方式调用。

类似的是np.select(并且np.where恰好是两个部分)。调用开销与以相同方式矢量化相同,但它将评估所有数据点的所有函数。因此,它会比 慢np.piecewise,特别是当函数很昂贵时。在某些情况下,is 更方便(没有 lambda),并且可以更轻松地将概念扩展到许多变量。

于 2014-10-08T11:44:50.253 回答