2014-10-16 17 views
1

我現在正在運行Enthought Canopy 1.4.1 64位。 出於某種原因,我剛剛編寫的代碼在按下「播放」按鈕時會生成完全不同的圖表(使用matplotlib),而不是將代碼複製並粘貼到命令行並按Enter鍵。Python Canopy NumPy:按「Play」運行代碼並不能獲得與在命令行中複製和粘貼代碼相同的結果

特別是以下行產生兩種不同的結果:

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

當按下播放,我得到:

w1 
Out[7]: array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) 

當複製和粘貼完全相同的代碼,然後按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]) 

我認爲我的圖表弄亂了什麼,有人知道爲什麼會發生這種情況嗎?

+1

您是否檢查過以確保C和R的值在兩種環境中都相同?打印值並查看。 – senderle 2014-10-16 15:20:34

+0

謝謝,R和C是一樣的。如何計算w1得出兩個不同的結果?這沒有任何意義.. – erantdo 2014-10-16 17:25:05

回答

6

沒有看到你的代碼的其餘部分,最有可能的候選人是sum

  • 在香草蟒(當你的腳本運行的),sum是Python的內置功能,不知道numpy的陣列。

  • 在IPython中的Pylab模式(如在樹冠的IPython的提示),其隱含有from numpy import *(非常混亂的開始,一個原因是,IPython的球隊現在不鼓勵使用它們Pylab模式下,我猜雨棚將按照之前長),sum是numpy函數,其行爲完全不同。

查找這兩個sum功能,並嘗試在你的腳本中使用numpy.sum代替sum

欲瞭解更多背景:

@ Senderle對你的問題點,在IPython中幾乎所有的這種差異的更普遍的解釋第一條註釋 - 當你運行一個腳本,它不知道任何一個值,在你的全局ipython命名空間。當腳本運行時,默認情況下,它的全局名稱空間被插入到你的ipython命名空間中,但不是相反。因此,Ipython命令可以檢查正在運行的腳本的結果,但運行中的腳本無法查看/使用先前在IPython提示符處定義的值(包括導入)(除非將它們顯式傳遞給正在運行的腳本)。

最常見的例子是這篇文章中描述的例子: Modules are already available in Canopy's Python (PyLab) prompt, but not in a script,但它也適用於senderle指向的數據值。

因此,要回到您的問題 - 您(或Pylab啓動)在IPython提示中定義了某些內容(在運行腳本中未以相同方式定義),並且差異。如果它不是sum,那麼我建議你把它縮小到最簡單的情況(只有幾行),然後它應該跳出去;或者如果沒有,你可以在這裏發佈,它會跳出別人。

+0

它的工作!哇,我不會在一百萬年裏想到它!非常感謝! – erantdo 2014-10-17 06:51:42