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)
我认为这是弄乱我的图表的,有谁知道为什么会发生这种情况?
在没有看到其余代码的情况下,最有可能的候选者是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,那么我建议你把它缩小到最简单的情况(只有几行),然后它应该跳出来; 或者,如果没有,你可以在这里发布,它会跳出其他人.