numpy.product vs numpy.prod vs ndarray.prod

时间:2018-04-16 18:04:31

标签: python numpy numpy-ndarray

我正在阅读Numpy文档,看来函数np.prod(...)np.product(...)ndarray方法a.prod(...)都是等价的。

在样式/可读性和性能方面是否有首选版本?是否存在不同版本更为可取的不同情况?如果没有,为什么有三种独立但非常相似的方式来执行相同的操作?

2 个答案:

答案 0 :(得分:5)

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

np.prodndarray.prod最终都会调用umath.multiply.reduce,所以它们之间确实没有区别,除了免费函数可以接受array- 之类的<除了NumPy数组之外,还有/ em>类型(如Python列表)。

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

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

简而言之,现在它们相同,并且np.prod超过np.product,因为后者是可能被弃用的别名。

答案 1 :(得分:3)

这是我可以从 NumPy 1.14.0 的源代码中收集的内容。有关当前Master分支(NumPy 1.15.0)的答案,请参阅miradulo的答案。

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

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

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

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

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

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