numpy中frompyfunc和vectorize之间的区别

Oli*_*ier 30 python arrays numpy vectorization

numpy中vectorizefrompyfunc有什么区别?

两者看起来非常相似.每个人的典型用例是什么?

编辑:正如JoshAdel所指出的,这个课程vectorize似乎是建立在上面的frompyfunc.(见来源).我还不清楚是否frompyfunc可能有任何未被vectorize...... 覆盖的用例

Stu*_*erg 17

正如约什阿德尔指出的那样,vectorize包裹着frompyfunc.Vectorize增加了额外的功能:

  • 从原始函数复制docstring
  • 允许您从广播规则中排除参数.
  • 返回正确dtype的数组,而不是dtype = object

编辑:经过一些简短的基准测试后,我发现它vectorizefrompyfunc大型数组慢得多(~50%).如果性能在您的应用程序中至关重要,请首先对用例进行基准测试.

`

>>> 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)
Run Code Online (Sandbox Code Playgroud)

`

  • Intersting ...但差异和用例对我来说仍然不太清楚...... (3认同)

Jos*_*del 8

我不确定每个用例的不同用例是什么,但是如果你看一下源代码(/numpy/lib/function_base.py),你就会看到它的vectorize包装frompyfunc.我对代码的阅读主要vectorize是正确处理输入参数.可能有一些特殊的情况,你更喜欢一个与另一个,但它似乎frompyfunc只是一个较低级别的实例vectorize.

  • 我同意你的观点,`frompyfunc`似乎低于`vectorize`.但问题是,是否存在您更喜欢使用`frompyfunc`而不是`vectorize`的情况? (3认同)

小智 6

虽然这两种方法都为您提供了构建自己的ufunc 的方法,但numpy.frompyfunc方法始终返回一个 python 对象,而您可以在使用numpy.vectorize方法时指定返回类型