J'ai déjà trouvé la source du numpy.ma.where () mais il semble appeler la fonction numpy.where () et pour mieux la comprendre, j'aimerais jeter un coup d'œil si possible.
4 Réponses :
Vous pouvez trouver le code dans numpy.core.multiarray
Il ne semble pas y avoir beaucoup de code, c'est principalement de la documentation.
C: \ Users \ est l'endroit où je l'ai trouvé.
J'ai un fichier multiarray.cp37-win_amd64.pyd à la place.
La plupart des fonctions Python sont écrites en langage Python, mais certaines fonctions sont écrites dans quelque chose de plus natif (souvent le langage C).
Il y a quelques techniques que vous pouvez utiliser pour demander à Python lui-même où une fonction est définie. Probablement le plus portable utilise le module inspect :
{"where",
(PyCFunction)array_where,
METH_VARARGS, NULL},
Mais cela ne fonctionnera pas avec une fonction native ("intégrée"):
>>> import numpy as np >>> np.where <built-in function where> >>> np.where.__module__ 'numpy.core.multiarray'
Malheureusement, Python ne fournit pas d'enregistrement des fichiers source pour les fonctions intégrées. Vous pouvez trouver quel module fournit la fonction:
>>> import numpy >>> import inspect >>> inspect.isbuiltin(numpy.where) True >>> inspect.getsourcefile(numpy.where) TypeError: <built-in function where> is not a module, class, method, function, traceback, frame, or code object
Python ne vous aidera pas à trouver le code source natif (C) de ce module, mais dans ce cas, il est raisonnable de recherchez dans le projet numpy une source C qui porte des noms similaires. J'ai trouvé le fichier suivant:
numpy / core / src / multiarray / multiarraymodule.c
Et dans ce fichier, j'ai trouvé une liste de définitions ( PyMethodDef ) comprenant :
>>> import numpy >>> import inspect >>> inspect.isbuiltin(numpy.ma.where) False >>> inspect.getsourcefile(numpy.ma.where) '.../numpy/core/multiarray.py'
Cela suggère que la fonction C array_where est celle que Python considère comme "where" . p>
La fonction array_where est définie dans le même fichier, et elle délègue principalement à la fonction PyArray_Where .
La fonction np.where de NumPy est écrite en C, pas en Python. Un bon endroit pour regarder est PyArray_Where .
Cette méthode fonctionnera-t-elle également pour d'autres bibliothèques Python comme les pandas?
@ usr48 Oui, le processus de recherche du code source sera similaire dans d'autres bibliothèques comme pandas. Pandas est principalement du Python pur, donc inspect.getsourcefile fonctionnera dans la plupart des cas.
@RJHunter J'ai juste essayé de reproduire vos exemples avec numpy version 1.17. Après avoir exécuté print (inspect.isbuiltin (numpy.where), inspect.getsourcefile (numpy.where)) Igot False <__ array_function__ internals> . Pouvez-vous expliquer cela?
@MichaelS NumPy a introduit une couche wrapper supplémentaire de Python généré. Si vous recherchez dans la source numpy <__ array_function__ internals> , vous pouvez voir que ce faux nom de fichier provient de la couche d’habillage: github.com/numpy/numpy/blob/v1.17.4/numpy/core/... Ce code donne également l'indice que vous pouvez inspecter numpy.where._implementation pour parcourir ce wrapper et trouver la fonction intégrée couverte par la réponse. (Je ne prévois pas de mettre à jour la réponse - cette question a été fermée et j'ai réduit mon implication avec Stack Overflow)
Premièrement, il existe 2 versions distinctes de où , l'une qui ne prend que la condition , l'autre qui prend 3 tableaux.
Le plus simple est le plus couramment utilisé et n'est qu'un autre nom pour np.nonzero . Cela parcourt le tableau condition deux fois. Une fois avec np.count_nonzero pour déterminer le nombre d'entrées différentes de zéro, ce qui lui permet d'allouer les tableaux de retour. La deuxième étape consiste à remplir les coordonnées de toutes les entrées différentes de zéro. La clé est qu'il renvoie un tuple de tableaux, un tableau pour chaque dimension de condition .
La version condition, x, y prend trois tableaux, qu'elle diffuse les uns contre les autres. Le tableau de retour a la forme diffusée commune, avec des éléments choisis parmi x et y comme expliqué dans les réponses à votre question précédente, Comment numpy.where () sélectionne-t-il exactement les éléments dans cet exemple? < / p>
Vous vous rendez compte que la majeure partie de ce code est c ou cython , avec un important sujet de prétraitement. Il est difficile à lire, même pour les utilisateurs expérimentés. Il est plus facile d'exécuter une variété de cas de test et d'avoir une idée de ce qui se passe de cette façon.
Quelques points à surveiller. np.where est une fonction python, et python évalue complètement chaque entrée avant de les lui transmettre. Il s'agit d'une affectation conditionnelle et non d'une fonction d'évaluation conditionnelle.
Et à moins que vous ne transmettiez 3 tableaux qui correspondent à la forme, ou scalaires x et y , vous aurez besoin d'une bonne compréhension de la diffusion.
Ma confusion vient des trois paramètres dont on décide de la forme de la valeur de retour.
C'est la diffusion conjointe. Dans chacun des exemples de votre autre question, les trois paramètres ont la même forme (une fois qu'ils sont transformés en tableaux). Cette même diffusion nous permet d'ajouter et de multiplier des tableaux. np.broadcast_arrays peut vous aider à explorer cela.
Cette question a été posée ici, s'il vous plaît jeter un oeil, il y a quelques réponses. stackoverflow.com/ questions / 34667282 /…
Aucune des questions ci-dessus ne concerne le code source.
ligne 2920 dans github.com/numpy/numpy / blob / master / numpy / core / src / multiarray /… il est enveloppé dans du code c
Comme le souligne NaN, la fonction est implémentée en C. L'emplacement spécifique de la fonction C est github.com/numpy/numpy/blob/...