我正在阅读Numpy文档,看来函数np.prod(...)
,np.product(...)
和ndarray
方法a.prod(...)
都是等价的。
在样式/可读性和性能方面是否有首选版本?是否存在不同版本更为可取的不同情况?如果没有,为什么有三种独立但非常相似的方式来执行相同的操作?
答案 0 :(得分:5)
从今天的主分支(1.15.0)开始,np.product
只使用np.prod
,最终可能会被弃用。见MAINT: Remove duplicate implementation for aliased functions. #10653。
而np.prod
和ndarray.prod
最终都会调用umath.multiply.reduce
,所以它们之间确实没有区别,除了免费函数可以接受array- 之类的<除了NumPy数组之外,还有/ em>类型(如Python列表)。
在此之前,与NumPy 1.14.2一样,声明np.product
和np.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的答案。
对于ndarray
,prod()
和product()
是等效的。
对于ndarray
,prod()
和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()
。
我不确定您关于偏好和可读性的问题的后半部分。