vectorize array python arrays numpy vectorization

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.