numpy.vectorize
accetta una funzione f: a-> b e la trasforma in g: a [] -> b [].Utilizzo di Numpy Vectorize su Funzioni che restituiscono vettori
Questo funziona bene quando a
e b
sono scalari, ma non riesco a pensare a una ragione per la quale non avrebbe funzionato con b come ndarray
o un elenco, cioè f: a-> b [] e g: un [] -> b [] []
Ad esempio:
import numpy as np
def f(x):
return x * np.array([1,1,1,1,1], dtype=np.float32)
g = np.vectorize(f, otypes=[np.ndarray])
a = np.arange(4)
print(g(a))
Questo produce:
array([[ 0. 0. 0. 0. 0.],
[ 1. 1. 1. 1. 1.],
[ 2. 2. 2. 2. 2.],
[ 3. 3. 3. 3. 3.]], dtype=object)
Ok, in modo che dà i giusti valori, ma il DTYPE sbagliata. E ancora peggio:
g(a).shape
rendimenti:
(4,)
Quindi questo array è praticamente inutile. So che posso convertirlo fare:
np.array(map(list, a), dtype=np.float32)
di darmi quello che voglio:
array([[ 0., 0., 0., 0., 0.],
[ 1., 1., 1., 1., 1.],
[ 2., 2., 2., 2., 2.],
[ 3., 3., 3., 3., 3.]], dtype=float32)
ma che non è né efficiente né divinatorio. Qualcuno di voi può trovare un modo più pulito per farlo?
Grazie in anticipo!
Infatti, "solo una funzione di convenienza" descrive la maggior parte dell'APP numpy. Questo è il punto. Peccato che questa funzione non si comporti come ci si aspetterebbe. –
La maggior parte delle funzioni NumPy è solo un po 'più lenta della funzione equivalente scritta in C. Ciò è vero quando la funzione NumPy è semplicemente un involucro sottile attorno a una funzione C (o Fortran). Al contrario, una funzione 'np.vectorized' deve ancora chiamare una * funzione Python * una volta per ogni elemento dell'array, quindi esegue più come il codice Python che il codice C. Le ricerche di nomi dinamici di Python offrono maggiore flessibilità, ma possono essere molto più lente del codice C. – unutbu
non secondo https://stackoverflow.com/questions/35215161/most-efficient-way-to-map-function-over-numpy-array –