Je lis les documents Numpy et il semble que les fonctions np.prod(...)
, np.product(...)
et la méthode ndarray
a.prod(...)
sont toutes équivalentes.
Y a-t-il une version préférée à utiliser, à la fois en termes de style/lisibilité et de performances? Y a-t-il différentes situations où différentes versions sont préférables? Sinon, pourquoi existe-t-il trois façons distinctes mais très similaires d'effectuer la même opération?
Depuis la branche maître aujourd'hui (1.15.0), np.product
utilise simplement np.prod
, et peut être obsolète à terme. Voir MAINT: Supprimer l'implémentation en double pour les fonctions aliasées. # 1065 .
Et np.prod
et ndarray.prod
les deux finissent par appeler umath.multiply.reduce
, donc il n'y a vraiment aucune différence entre eux, outre le fait que les fonctions libres peuvent accepter des types de tableau - comme (comme Python listes) en plus des tableaux NumPy.
Avant cela, comme dans NumPy 1.14.2, la documentation demandait np.product
et np.prod
étaient les mêmes, mais il y avait des bogues en raison de l'implémentation dupliquée mentionnée par Parag. c'est-à-dire l'exemple d'Eric Weiser de # 10651 :
>>> class CanProd(object): def prod(self, axis, dtype, out): return "prod" >>> np.product(CanProd()) <__main__.CanProd object at 0x0000023BAF7B29E8> >>> np.prod(CanProd()) 'prod'
Donc, en bref, ils sont maintenant les mêmes et favorisent np.prod
plus de np.product
puisque ce dernier est un alias qui peut être déprécié.
C'est ce que j'ai pu rassembler à partir des codes sources de NumPy 1.14.. Pour la réponse relative à la branche Master actuelle (NumPy 1.15.0), voir la réponse de miradulo.
Pour un ndarray
, prod()
et product()
sont équivalents.
Pour un ndarray
, prod()
et product()
appellera tous les deux um.multiply.reduce()
.
Si le type d'objet n'est pas ndarray
mais qu'il a toujours une méthode prod
, alors prod()
renverra prod(axis=axis, dtype=dtype, out=out, **kwargs)
tandis que product
sera essayez d'utiliser um.multiply.reduce
.
Si l'objet n'est pas un ndarray
et qu'il n'a pas de méthode prod
, alors il se comportera comme product()
.
ndarray.prod()
est équivalent à prod()
.
Je ne suis pas sûr de la dernière partie de votre question concernant les préférences et la lisibilité.