python - array - Diferencia entre frompyfunc y vectorize en numpy
numpy map (3)
Aunque ambos métodos le proporcionan una forma de crear su propio método ufunc , numpy.frompyfunc siempre devuelve un objeto python, mientras que puede especificar un tipo de devolución cuando usa el método numpy.vectorize
¿Cuál es la diferencia entre vectorize y frompyfunc en numpy?
Ambos parecen muy similares. ¿Cuál es un caso de uso típico para cada uno de ellos?
Editar : como indica JoshAdel, el vectorize
clase parece estar basado en frompyfunc
. (ver la fuente ). Todavía no está claro si frompyfunc
puede tener algún caso de uso que no esté cubierto por vectorize
...
Como señala JoshAdel, vectorize
wraps frompyfunc
. Vectorize agrega características adicionales:
- Copia la docstring de la función original
- Le permite excluir un argumento de las reglas de transmisión.
- Devuelve una matriz del tipo de letra correcto en lugar de dtype = object
Editar: Después de una breve evaluación comparativa, encuentro que vectorize
es significativamente más lento (~ 50%) que frompyfunc
para arreglos grandes. Si el rendimiento es crítico en su aplicación, compare primero su caso de uso.
`
>>> a = numpy.indices((3,3)).sum(0)
>>> print a, a.dtype
[[0 1 2]
[1 2 3]
[2 3 4]] int32
>>> def f(x,y):
"""Returns 2 times x plus y"""
return 2*x+y
>>> f_vectorize = numpy.vectorize(f)
>>> f_frompyfunc = numpy.frompyfunc(f, 2, 1)
>>> f_vectorize.__doc__
''Returns 2 times x plus y''
>>> f_frompyfunc.__doc__
''f (vectorized)(x1, x2[, out])/n/ndynamic ufunc based on a python function''
>>> f_vectorize(a,2)
array([[ 2, 4, 6],
[ 4, 6, 8],
[ 6, 8, 10]])
>>> f_frompyfunc(a,2)
array([[2, 4, 6],
[4, 6, 8],
[6, 8, 10]], dtype=object)
`
No estoy seguro de cuáles son los diferentes casos de uso para cada uno, pero si miras el código fuente (/numpy/lib/function_base.py), verás que vectorize
wraps frompyfunc
. Mi lectura del código es principalmente que vectorize
está haciendo un manejo adecuado de los argumentos de entrada. Puede haber casos particulares en los que prefiera uno frente a otro, pero parece que frompyfunc
es solo una instancia de vectorize
de nivel inferior.