La modification d'un tableau numpy l'intérieur d'une fonction?
J'ai un problème avec le programme simple ci-dessous :
def my_function(my_array = np.zeros(0)):
my_array = [1, 2, 3]
my_array = np.zeros(0)
my_function(my_array)
print my_array
Il imprime un tableau vide, comme si my_array
a été adoptée par copie et non pas par référence à l'intérieur de la fonction. Comment faire pour corriger cela ?
OriginalL'auteur Vincent | 2013-03-04
Vous devez vous connecter pour publier un commentaire.
np.zeros(0)
vous donne un vide tableau numpy. La référence à l'intérieur de votre fonction ici une nouvelle liste Python, mais vous n'avez pas modifié votre vide tableau numpy, donc c'est toujours ce que vous avez l'impression d'.Vous recommandons de lire cette réponse de clarifier certains concepts.
Pas de soucis 🙂
Je ne comprends pas pourquoi lorsque j'imprime le tableau à l'intérieur de la fonction, il fonctionne bien, mais pas à l'extérieur...
Vous devriez lire la première réponse ici stackoverflow.com/questions/986006/...
OriginalL'auteur YXD
Le passe-par-modèle de référence est plus un passe-par-valeur d'un pointeur. Donc, à l'intérieur de votre my_function vous disposez d'une copie d'un pointeur à l'original de votre my_array. Si vous utilisez le pointeur de manipuler les entrées de la matrice de directement qui permettrait de faire un changement, mais une ré-affectation de la copie d'un pointeur n'affectera pas le tableau d'origine.
Comme un exemple:
Le code ci-dessus va changer la valeur interne de l'ar.
OriginalL'auteur Ramon J Romero y Vigil
Vous pouvez utiliser la tranche d'affectation ici, tout comme vous le feriez pour une liste:
Notez que cela nécessite encore l'
my_array
a au moins 3 éléments ... Exemple d'utilisation:La chose qui vous manque c'est la façon python traite avec des références. Lorsque vous entrez
my_function
, vous avez une référence à l'original ndarray objet lié au nom demy_array
. Cependant, dès que vous attribuer quelque chose de nouveau à ce nom, vous perdez votre référence d'origine et de le remplacer par une référence à un objet (dans ce cas, une liste).Remarque que le fait d'avoir un argument par défaut qui est un objet mutable peut souvent conduire à des surprises
:3
. Si l'entrée de la matrice a, disons, dix éléments, ce code ne ferait pas ce que je soupçonne l'OP pourrait s'attendre à partir de son code.Cela ne fait pas travailler - essayez
a = np.zeros(0)
eta[:3] = [1,2,3]
Assurez-vous. Je suppose que je suis en supposant que l'opération est, en réalité, va passer dans un argument qui est assez grand pour gérer les RHS dans le calcul.
OriginalL'auteur mgilson