web-dev-qa-db-fra.com

numpy.product vs numpy.prod vs ndarray.prod

Je lis les documents Numpy et il semble que les fonctions np.prod(...), np.product(...) et la méthode ndarraya.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?

10
dkv

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é.

7
miradulo

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é.

4