numpy中frompyfunc和vectorize的区别

Posted

技术标签:

【中文标题】numpy中frompyfunc和vectorize的区别【英文标题】:Difference between frompyfunc and vectorize in numpy 【发布时间】:2011-10-09 17:47:37 【问题描述】:

numpy 中vectorize 和frompyfunc 有什么区别?

两者看起来非常相似。它们各自的典型用例是什么?

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

【问题讨论】:

有任何 numpy 开发人员可以解决这个问题吗? Numpy 有很多这样的情况,在文档中存在更高和更低级别的实现,它们之间没有指针。 出于某种秘密原因,frompyfunc 生成的函数有意识地忽略 dtype 参数并返回 objects 数组。正如文档所解释的,“返回的 ufunc 总是返回 PyObject 数组”。有一个简单而巧妙的解决方法:提交所需类型的数组作为out 参数。相反,vectorize 函数允许使用 otypes 参数指定 ufunc 的输出类型,但与使用嵌套列表相比,它应该很慢,因此相当无用。 【参考方案1】:

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

从原始函数复制文档字符串 允许您从广播规则中排除参数。 返回正确 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)

`

【讨论】:

有趣...但是我仍然不清楚差异和用例...【参考方案2】:

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

【讨论】:

我同意你的观点,frompyfunc 似乎低于vectorize。但是,问题仍然存在,是否存在您更愿意使用 frompyfunc 而不是 vectorize 的情况? 我认为你不能像***.com/a/27912352/3226167那样在vectorize中使用.accumulate【参考方案3】:

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

【讨论】:

以上是关于numpy中frompyfunc和vectorize的区别的主要内容,如果未能解决你的问题,请参考以下文章

科学计算基础软件包NumPy入门讲座:常用函数

在 C 和 C++ 中对齐堆数组以简化编译器 (GCC) 向量化

torch和numpy的对比

C++ 矩阵乘法自动向量化

cupy或numpy中"数组"与"矩阵"的区别

在 for 循环中删除和添加 numpy 数组行以从更大的 numpy 数组创建动态子数组,