【问题标题】:Piecewise functions on Numpy ArraysNumpy 数组上的分段函数
【发布时间】:2014-12-02 23:57:12
【问题描述】:

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

【问题讨论】:

    标签: python arrays numpy scipy piecewise


    【解决方案1】:

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

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

    【讨论】:

    • 好答案。使用np.select()np.where() 的另一个优点是您可以在进行计算时访问整个数组。如果您的函数依赖于输入中的其他值(例如,每个点的相邻值),这将很有用。但在 OP 的情况下没关系,np.piecewise() 很好。
    猜你喜欢
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2016-10-02
    • 2020-08-04
    • 1970-01-01
    相关资源
    最近更新 更多