Python Canopy NumPy:按"播放"运行代码与在命令行中复制和粘贴代码的结果不同

era*_*tdo 1 python numpy canopy

我现在运行Enthought Canopy 1.4.1 64位一年.出于某种原因,我刚刚编写的代码在按下"播放"按钮时生成完全不同的图表(使用matplotlib),而不是将代码复制并粘贴到命令行并按Enter键.

特别是,以下行产生两种不同的结果:

w1 = array(dot(matrix(C).I,R - 0.03)/sum(dot(matrix(C).I,R - 0.03)))[0]

按下Play时,我得到:

w1
Out[7]: array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
Run Code Online (Sandbox Code Playgroud)

复制并粘贴完全相同的代码并按Enter键时,我得到:

w1
Out[9]: 
array([-0.53497564,  0.77325699,  0.3289724 ,  0.2127899 ,  0.29026341,
        0.18743744, -0.24510907, -0.1117449 , -0.2534066 ,  0.15694775,
        0.19556833])
Run Code Online (Sandbox Code Playgroud)

我认为这是弄乱我的图表的,有谁知道为什么会发生这种情况?

Jon*_*rch 6

在没有看到其余代码的情况下,最有可能的候选者是sum.

  • 在vanilla python中(当你的脚本运行时),sum是python内置函数,它不知道numpy数组.

  • 在IPython的Pylab模式中(如Canopy的ipython提示),隐含地开始from numpy import *(非常令人困惑,以及IPython团队现在不鼓励使用他们的Pylab模式的一个原因,我猜Canopy将会不久之后),这sum是numpy功能,表现完全不同.

查找这两个sum函数,并尝试使用numpy.sum而不是sum在脚本中.

更多背景信息:

@Senderle对你的问题的第一个评论指向对ipython中几乎所有这些差异的更一般的解释 - 当你运行一个脚本时,它不知道你的全局ipython命名空间中的任何值.在脚本运行时,默认情况下,其全局命名空间将插入到您的ipython命名空间中,但不是相反.因此,Ipython命令可以检查正在运行的脚本的结果,但是正在运行的脚本无法查看/使用先前在IPython提示符下定义的值(包括导入)(除非它们已显式传递给正在运行的脚本).

最常见的例子是本文中描述的模块: 模块已经在Canopy的Python(PyLab)提示中可用,但不在脚本中,但它也适用于senderle所指向的数据值.

所以回到你的问题 - 你(或Pylab启动)已经在IPython提示中定义了一些在运行脚本中没有以相同方式定义的东西的100比1的赔率,这就解释了这个差异.如果不是sum,那么我建议你把它缩小到最简单的情况(只有几行),然后它应该跳出来; 或者,如果没有,你可以在这里发布,它会跳出其他人.