Область переменных изменяется в последовательных ячейках с использованием %% времени в блокноте Jupyter - PullRequest
4 голосов
/ 25 марта 2019

TL; DR

У меня странная проблема (или я упускаю что-то простое). У меня есть блокнот Jupyter, и в одной ячейке есть переменная, сохраненная как numpy.ndarray, но когда я печатаю ее тип в следующей ячейке, переменная появляется как list. Как это возможно? На моей машине работает нормально, на ВМ нет.


Подробное описание:

Я работаю над определенным запросом на извлечение обновлением записной книжки Jupyter, и, поскольку у меня возникли некоторые проблемы с графикой в ​​моей текущей установке, я попытался протестировать ее на другом компьютере / системе с обновленными пакетами и компонентами. .

В моем ноутбуке у меня Ubuntu 16.04 и эта конфигурация:

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

Я создал виртуальную машину, установил Ubuntu 18.04 и использую эту конфигурацию:

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

Затем я определил, что в ВМ переменная меняет свой тип с numpy.ndarray на list без причины (для меня). Переменная pos. Это вызывает у меня проблемы, так как оно используется позже для целей индексации

Ноутбук

Laptop

Виртуальная машина: vm

Что здесь происходит? Я что-то упустил по этому поводу?

Любая подсказка приветствуется :) Спасибо.


UPDATE:

Я пробовал другой блокнот в ВМ, и теперь это не просто изменение типа, но переменная, не достигнутая в другой ячейке (переменная joint_vars):

enter image description here

Должна ли быть какая-то неверная конфигурация среды в ВМ?

Ответы [ 2 ]

6 голосов
/ 26 марта 2019

Я полагаю, что проблема здесь заключается в изменении способа обработки области магии клетки. Ваш ноутбук работал под управлением IPython 7.2.0; ваша виртуальная машина работает 7.4.0. Старое поведение изменилось в 7.4.0 (это может быть ошибка, которая будет исправлена ​​в будущем выпуске).

Я подозреваю, что pos был ранее определен как список в вашей записной книжке. В 7.4.0 (как на вашей виртуальной машине) все в ячейке обрабатывается как локальная область. Например:

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'

Если вы запустите ту же самую вещь с 7.3.0, вы получите

In [4]: foo
Out[4]: 5

Поскольку foo был ранее определен как строка, вы наблюдаете, что тип foo (по состоянию на ячейку 4) изменяется в зависимости от версии IPython. (Здесь должно быть целочисленное изменение строки.) Это более тонко, когда задействованные типы тесно связаны, например списки и массивы в вашем случае. Дело не в том, что тип изменился из-за ячейки; так как новое значение не было присвоено, поэтому оно сохранило свой старый тип.

Решение состоит в том, чтобы на какое-то время понизить виртуальную машину до IPython 7.3.0 или избежать использования магии %%time.

2 голосов
/ 29 марта 2019

Для временного решения проблемы вы можете явно поместить оператор global в ячейку %%time, чтобы другие ячейки могли видеть переменную.

%%time
global foo
foo = something()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...