numpy中frompyfunc和vectorize之间的区别

时间:2011-07-20 20:40:03

标签: python arrays numpy vectorization

numpy中vectorizefrompyfunc之间有什么区别?

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

编辑:正如JoshAdel所指出的,课程vectorize似乎建立在frompyfunc之上。 (见the source)。我仍然不清楚frompyfunc是否可能有vectorize未涵盖的任何用例......

3 个答案:

答案 0 :(得分:15)

正如JoshAdel指出的,vectorize包裹frompyfunc。 Vectorize增加了额外的功能:

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

编辑经过一些简短的基准测试后,我发现大型数组的vectorize明显慢于frompyfunc(约为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)

`

答案 1 :(得分:8)

我不确定每个用例的不同用例是什么,但如果查看源代码(/numpy/lib/function_base.py),您会看到vectorize包裹{{1 }}。我对代码的阅读主要是frompyfunc正在正确处理输入参数。在某些特定情况下,您可能更喜欢其中一个,但似乎vectorize只是frompyfunc的较低级别实例。

答案 2 :(得分:2)

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