numpy.product 对比 numpy.prod 对比 ndarray.prod

numpy.product vs numpy.prod vs ndarray.prod

我正在通读 Numpy 文档,函数 np.prod(...)np.product(...)ndarray 方法 a.prod(...) 似乎都是等效的。

在 style/readability 和性能方面是否有首选版本可供使用?是否存在不同版本更可取的不同情况?如果不是,为什么有三种不同但非常相似的方法来执行相同的操作?

这是我从 NumPy 1.14.0 的源代码中收集到的内容。与当前Master分支(NumPy 1.15.0)相关的答案,参见miradulo的答案。

  • 对于 ndarrayprod()product() 是等价的。

  • 对于 ndarrayprod()product() 都会调用 um.multiply.reduce().

  • 如果对象类型不是ndarray但它仍然有prod方法,那么prod()将returnprod(axis=axis, dtype=dtype, out=out, **kwargs)product 将尝试使用 um.multiply.reduce.

  • 如果对象不是 ndarray 并且它没有 prod 方法,那么它将表现为 product()

  • ndarray.prod()相当于prod().

我不确定你关于偏好和可读性的问题的后半部分。

从今天的 master 分支 (1.15.0) 开始,np.product 仅使用 np.prod,最终可能会被弃用。参见 MAINT: Remove duplicate implementation for aliased functions. #10653

np.prodndarray.prod最终都会调用umath.multiply.reduce,所以除了自由函数可以接受array-[=31之外,它们之间真的没有区别=]like 类型(如 Python 列表)以及 NumPy 数组。

在此之前,就像在 NumPy 1.14.2 中一样,文档声称 np.productnp.prod 是相同的,但是由于 Parag 提到的重复实现而存在错误。即来自 #10651 的 Eric Weiser 示例:

>>> class CanProd(object):
        def prod(self, axis, dtype, out): return "prod"  
>>> np.product(CanProd())
<__main__.CanProd object at 0x0000023BAF7B29E8>
>>> np.prod(CanProd())
'prod'

所以简而言之,现在它们是一样的,并且 np.prodnp.product 更受青睐,因为后者是一个可能被弃用的别名。