As JoshAdel points out, vectorize wraps frompyfunc. Vectorize adds extra features:
- Copies the docstring from the original function
- Allows you to exclude an argument from broadcasting rules.
- Returns an array of the correct dtype instead of dtype=object
Edit: After some brief benchmarking, I find that vectorize is significantly slower (~50%) than frompyfunc for large arrays. If performance is critical in your application, benchmark your use-case first.
`
>>> 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)
`
frompyfuncproduces functions that consciously disregard thedtypeargument and return an array ofobjects. As the documentation explains, "The returned ufunc always returns PyObject arrays". There is an easy and ingenious workaround: submit an array of desired type asoutargument. Thevectorizefunction, on the contrary, allows to specify the output type of the ufunc withotypesargument, but it is supposed to be slow and hence fairly useless, compared to using nested lists.