2014-10-08 29 views
5

Numpy Array'da Piecewise işlevlerini uygulamak için verimli (hız) yol nedir?Numpy Array'larında parçalı fonksiyonlar

For (1) : x<=2 f(x) = 2*x + x^2 
    (2) : x>2 f(x) = -(x^2 + 2) 

İşte ne yaptım gibi

Say, örneğin, parçalı fonksiyonlar bulunmaktadır.

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

Daha küçük diziler, geniş diziler, birçok işlev vb. Için etkili bir yöntem var mı? Benim endişem, kullanılan lambda fonksiyonları ile. Bunların Numpy optimize edilmiş olup olmadığından emin değil.

cevap

3

Bu durumda, lambdalar hakkında endişelenmemelisiniz: Numpy optimizasyonu, toplu işlerde aynı anda birçok değeri değerlendirmek için çağrı ek yükünü azaltmakla ilgilidir. Her çağrıya np.piecewise, funclist (işlev parçaları) içindeki her işlev, tam olarak bir kez çağrılır, uygun koşulun geçerli olduğu tüm değerlerden oluşan bir numpy dizisiyle. Böylece, bu lambda numpy ile optimize edilmiş bir şekilde çağrılır.

Benzer olarak np.select (ve tam olarak iki parça için np.where). Çağrı yükü, aynı şekilde vektörle aynıdır, ancak tüm veri noktaları için tüm fonksiyonları değerlendirir. Böylece, fonksiyonlar pahalı olduğunda, np.piecewise'dan daha yavaş olacaktır. Bazı durumlarda, daha uygun (lambda yok) ve bir tanesi konsepti birçok değişkene daha kolay genişletebilir.

+0

İyi yanıt. Np.select() 'veya' np.where() 'işlevlerinin kullanılmasının bir diğer avantajı, hesaplamaları yaparken tüm diziye erişebilmenizdir. Fonksiyonunuz girişteki diğer değerlere (örneğin, her bir noktanın komşu değerleri) bağlıysa, bu yararlı olacaktır. Ancak OP'nin durumunda, önemli değil ve 'np.piecewise()' iyi. –