Je suis confronté à un problème étrange (ou il me manque quelque chose de basique). J'ai un notebook Jupyter et dans une cellule il y a une variable enregistrée sous numpy.ndarray
, mais lorsque j'imprime son type dans la cellule suivante, la variable apparaît comme du type list code >. Comment est-ce possible? Dans ma machine fonctionne bien, dans une VM ne fonctionne pas.
Description détaillée:
Je travaille sur un certain pull request mettre à jour un notebook jupyter, et comme j'ai des problèmes de traçage dans ma configuration actuelle, j'ai essayé de tester il dans une machine / système différent avec des packages et des composants mis à jour.
Dans mon ordinateur portable, j'ai Ubuntu 16.04 et cette configuration:
> The version of the notebook server is: 5.7.6 The server is running on > this version of Python: Python 3.6.7 (default, Oct 22 2018, 11:32:17) > [GCC 8.2.0] > > Current Kernel Information: Python 3.6.7 (default, Oct 22 2018, 11:32:17) > IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help.
J'ai créé un virtuel machine, installé Ubuntu 18.04 et utiliser cette configuration:
> The version of the notebook server is: 5.7.4 The server is running on > this version of Python: Python 3.5.2 (default, Nov 12 2018, 13:43:14) > [GCC 5.4.0 20160609] > > Current Kernel Information: Python 3.5.2 (default, Nov 12 2018, > 13:43:14) > IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.
Ensuite, j'ai identifié que dans la VM, une variable change son type de numpy.ndarray
à list
sans raison (pour moi). La variable est pos
. Cela me pose des problèmes car il est utilisé plus tard à des fins d'indexation
Ordinateur portable:
Machine virtuelle:Que se passe-t-il ici? Est-ce que je manque quelque chose à ce sujet?
Tout indice est apprécié :) Merci.
MISE À JOUR:
Je ' J'ai essayé un autre notebook dans la VM, et maintenant ce n'est pas seulement le type qui change, mais la variable non atteinte dans une cellule différente (variable joint_vars
):
Doit-il s'agir d'une mauvaise configuration de l'environnement de la VM?
3 Réponses :
Je pense que le problème ici est un changement dans la façon dont la portée est gérée dans la magie cellulaire. Votre ordinateur portable exécutait IPython 7.2.0; votre VM exécute la version 7.4.0. L'ancien comportement a changé dans la version 7.4.0 (cela peut être un bogue à corriger dans une prochaine version).
Je soupçonne que pos
avait été précédemment défini comme une liste dans votre notebook. Dans 7.4.0 (comme sur votre VM), tout ce qui se trouve dans la cellule est traité comme une portée locale. Par exemple:
In [4]: foo Out[4]: 5
Si vous exécutez la même chose avec la version 7.3.0, vous vous retrouvez avec
Python 3.7.2 | packaged by conda-forge | (default, Mar 19 2019, 20:46:22) Type 'copyright', 'credits' or 'license' for more information IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help. In [1]: foo = "bar" In [2]: foo Out[2]: 'bar' In [3]: %%time ...: foo = 5 ...: ...: CPU times: user 3 µs, sys: 1 µs, total: 4 µs Wall time: 5.72 µs In [4]: foo Out[4]: 'bar'
Depuis foo a été défini comme une chaîne précédemment, l'effet que vous observez est que le type de foo
(à partir de la cellule 4) change en fonction de la version d'IPython. (Ici, ce qui devrait être un entier se transforme en chaîne.) Ceci est plus subtil lorsque les types impliqués sont étroitement liés, comme les listes et les tableaux numpy dans votre cas. Ce n'est pas que le type a changé à cause de la cellule; c'est que la nouvelle valeur n'a jamais été attribuée, elle a donc conservé son ancien type.
La solution est de rétrograder la VM vers IPython 7.3.0 pour le moment, ou d'éviter d'utiliser le %% time
magie cellulaire.
Merci pour votre réponse.
c'est une des raisons pour ne pas utiliser jupyter
Pour contourner le problème pour l'instant, vous pouvez explicitement mettre une instruction global
dans la cellule %% time
, afin que les autres cellules puissent voir la variable.
pré> XXX
Cela a fonctionné dans mon scénario, lorsque la variable (modin dataframe) n'était pas du tout définie dans les cellules suivantes.
Vous pouvez également essayer de redémarrer et d'exécuter toute la cellule, comme vous le feriez en exécutant python à partir de la CLI.
Êtes-vous sûr d'avoir exécuté toutes les cellules dans un ordre séquentiel? En regardant votre première cellule dans les deux captures d'écran, vous avez imprimé le type et il affiche numpy.ndarray dans les deux cas.
C'est la chose étrange ... lorsque j'imprime le type dans la cellule à laquelle la variable est attribuée, le type est OK. mais quand je continue avec les cellules suivantes, cela me donne le type
list
dans la VM@ Scratch'N'Purr, j'ai mis à jour l'article avec un comportement nouveau bizarre : la variable n'est pas atteinte dans la cellule suivante (?)
C'est vraiment étrange. Je me demande si cela a quelque chose à voir avec
%% time
. Essayez de supprimer cette ligne?vous l'avez ... J'ai supprimé
%% time
des deux cas et ils ont fonctionné. Dans le premier cas, le type de variable est ok, et dans le second cas, la variable existe dans la cellule suivante ... Une idée de pourquoi cela se produit?Je ne suis pas trop sûr mais je suppose que la fonction magique expose uniquement les variables à l'intérieur de la cellule elle-même. Après tout, le
%%
indique la magie de cellule . Si vous souhaitez obtenir les temps d'exécution de chaque cellule, Jupyter a un extension pour cela.