Qual è il modo efficiente (velocità) per applicare le funzioni a tratti su Numpy Array?Funzioni a tratti su Numpy Arrays
Diciamo, per esempio, le funzioni a tratti sono come
For (1) : x<=2 f(x) = 2*x + x^2
(2) : x>2 f(x) = -(x^2 + 2)
Ecco quello che ho fatto.
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]])
Esiste un metodo efficiente per array più piccoli, array di grandi dimensioni, molte funzioni ecc.? La mia preoccupazione è che vengano utilizzate le funzioni lambda. Non sono sicuro se questi sono ottimizzati per Numpy.
Buona risposta. Un altro vantaggio dell'uso di 'np.select()' o 'np.where()' è che quindi si ha accesso all'intero array quando si eseguono i calcoli. Se la tua funzione dipende da altri valori nell'input (ad esempio, i valori vicini di ciascun punto), ciò sarà utile. Ma nel caso dell'OP non ha importanza, e 'np.piecewise()' è buono. –