在numpy中,vectorize和frompyfunc有什么区别?
它们看起来非常相似。每个的典型用例是什么?
编辑:正如JoshAdel所指出的那样,类vectorize
似乎是建立在frompyfunc
之上的(参见the source)。我仍然不清楚frompyfunc
是否有任何未被vectorize
覆盖的用例...
在numpy中,vectorize和frompyfunc有什么区别?
它们看起来非常相似。每个的典型用例是什么?
编辑:正如JoshAdel所指出的那样,类vectorize
似乎是建立在frompyfunc
之上的(参见the source)。我仍然不清楚frompyfunc
是否有任何未被vectorize
覆盖的用例...
正如JoshAdel指出的那样,vectorize
封装了frompyfunc
。Vectorize添加了以下额外功能:
编辑:经过一些简短的基准测试,我发现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)
`
我不确定它们各自的不同用例,但如果你查看源代码(/numpy/lib/function_base.py),你会发现vectorize
包装了frompyfunc
。我的理解是,vectorize
在正确处理输入参数方面做得更好。也许在某些特定情况下,你会更喜欢其中之一,但似乎frompyfunc
只是vectorize
的一个较低级实例。
frompyfunc
似乎比vectorize
更低级。然而,问题仍然存在,即是否存在你更愿意使用frompyfunc
而不是vectorize
的情况? - Olivier Verdiervectorize
中使用 .accumulate
。 - user3226167
frompyfunc
生成的函数有意忽略dtype
参数并返回一个object
数组。正如文档所解释的那样,“返回的 ufunc 总是返回 PyObject 数组”。有一个简单而巧妙的解决方法:将所需类型的数组作为out
参数提交。相反,vectorize
函数允许使用otypes
参数指定 ufunc 的输出类型,但它被认为速度较慢,因此与使用嵌套列表相比几乎没有用处。 - Alexey