簡體   English   中英

Numpy Arrays上的分段函數

[英]Piecewise functions on Numpy Arrays

什么是在Numpy數組上應用分段函數的有效(速度)方法?

比方說,例如,分段函數就像

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優化的。

在這種情況下,您不應該關注lambdas:Numpy優化是關於減少調用開銷,讓函數在批處理中同時評估許多值。 在每次調用np.piecewisenp.piecewise中的每個函數(函數部分) funclist調用一次,其中numpy數組由適當條件為真的所有值組成。 因此,這些lambda是以numpy優化的方式調用的。

類似的是np.select (正好兩個部分的np.where )。 調用開銷與以相同方式進行矢量化相同,但它將評估所有數據點的所有函數。 因此,它將比np.piecewise慢,特別是當功能昂貴時。 在某些情況下,更方便(沒有lambda),並且可以更容易地將概念擴展到許多變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM