gpt4 book ai didi

python - 在 Jupyter Notebook 中使用 %%time 在连续单元格中更改变量范围

转载 作者:太空狗 更新时间:2023-10-30 02:07:04 25 4
gpt4 key购买 nike

长话短说

我遇到了一个奇怪的问题(或者我遗漏了一些基本的东西)。我有一个 Jupyter 笔记本,在一个单元格中有一个变量保存为 numpy.ndarray,但是当我在下一个单元格中打印它的类型时,该变量显示为 list。这怎么可能?在我的机器上工作正常,在 VM 中则不行。


详细说明:

我正在研究某个 pull request更新 jupyter notebook,由于我在当前设置中遇到一些绘图问题,我尝试在不同的机器/系统中使用更新的包和组件对其进行测试。

在我的笔记本电脑中,我有 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.

然后我发现在 VM 中,一个变量无缘无故地将其类型从 numpy.ndarray 更改为 list(对我而言)。变量是 pos。这给我带来了问题,因为它稍后用于索引目的

笔记本电脑:

Laptop

虚拟机: vm

这是怎么回事?我错过了什么吗?

感谢任何提示 :) 谢谢。


更新:

我在 VM 中尝试了另一个笔记本,现在不仅类型发生了变化,而且在不同的单元格中未达到变量(变量 joint_vars):

enter image description here

会不会是虚拟机环境配置错误?

最佳答案

我认为这里的问题是在单元魔法中处理范围的方式发生了变化。你的笔记本电脑运行的是 IPython 7.2.0;您的虚拟机运行的是 7.4.0。旧行为在 7.4.0 中发生了变化(这可能是一个将在未来版本中修复的错误)。

我怀疑 pos 之前已在您的笔记本中定义为列表。在 7.4.0 中(就像在您的 VM 上一样),单元格中的所有内容都被视为本地范围。例如:

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 的版本而变化。 (在这里,应该是一个整数更改为一个字符串。)当所涉及的类型密切相关时,这会更加微妙,例如您的情况下的列表和 numpy 数组。不是因为单元格而改变了类型;这是新值从未被分配,所以它保留了它的旧类型。

解决方案是暂时将 VM 降级到 IPython 7.3.0,或者避免使用 %%time 单元魔法。

关于python - 在 Jupyter Notebook 中使用 %%time 在连续单元格中更改变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55341134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com