2009-12-09 80 views
1

我的程序使用遺傳技術來構建等式。Python:「不支持的操作數類型爲+:'long'和'numpy.float64'」

它將字符串隨機組合成一個未知的等式。

"(((x + 1) * x)/(4 * 6) ** 2)" 

一個字符串的是: 「math.factorial(random.randint(1,9))」

所以方程通常是這樣的:

(((x + 1) * x)/(4 * 6) ** 2) + math.factorial(random.randint(1,9))

生成50個不同的方程,然後根據

分配一個適應值,它們在一定範圍的值上近似於sin函數。

for x in numpy.arange(1,6.4,.1): 
    fitness += abs(eval"(((x + 1) * x)/(4 * 6) ** 2) + math.factorial(random.randint(1,9)) - numpy.sin(x))") 

該程序經常會拋出一個異常,這是由'除了TypeError'條款捕獲。 錯誤消息是 「不支持的操作數類型+: '長' 和 'numpy.float64'」

當我嘗試 「型(numpy.sin(1))」,它返回

類型:numpy的。 float64

如何讓'long'和'numpy.float64'操作數類型一起工作? 任何幫助,將不勝感激。

@catchmeifyoutry:好主意!不幸的是,這是一個等式。我從來沒有

試圖採取一個這麼長的分開。我想知道是否有解析實用程序來幫助

解決所有括號。 (((math.factorial(random.randint(1,9)))) - (((x)+(((math.factorial(random.randint(1,9))))** ** ** ** - ((math.factorial(random.randint(1,9))))) - (((6.0)/(((8.0)/(((3.0) - (8.0))/(((5.0)*(( 2.0)/(x)))/(8.0))))+(4.0)))/(8.0))))+(7.0)))

我會嘗試捕捉x的值它失敗了。

+0

恢復良好,到目前爲止彼得。順便說一句,你說「類型(numpy.sin(1))」返回numpy.float64 ...可能是一個紅色的鯡魚。嘗試「type(x)」,在循環中...你會看到x也是一個numpy.float64。也許知道這將幫助你找到與真正長期不匹配的地方。 – 2009-12-10 01:37:35

+0

@彼得漢森:謝謝彼得,我會研究一下 – 2009-12-10 02:57:40

回答

3

首先,您在示例中缺少右括號,並且(+ or - or/or * or **)令人困惑。

你想達到什麼目的? 你只是想在字符串中插入結果嗎? 試試這個:

for x in numpy.arange(1,6.4,.1): 
    s = "sinus %f is %f!" % (x, numpy.sin(x)) 
    print type(s), s 

string formatting文檔。

編輯

是啊,遺傳編程,解釋你想要做什麼;)

根據您的更新的信息,我不得不猜測,您的字符串建設有時莫名其妙地出現故障。 更改您的代碼以顯示導致引發異常的字符串。最簡單的方法是在調用eval之前打印字符串,並在拋出異常時可以看到最後一個等式是什麼。 然後,如果不清楚它有什麼問題,可以在這裏發佈這個公式。

+0

是的,它讓人困惑。我希望我的編輯能夠清除它。 – 2009-12-10 00:22:20

+0

好的,但新的問題陳述只是不運行。如果你將數學引入到引號中,按照eval的要求(見bluce的答案),那麼我不會有任何錯誤。你能不能給出重現問題標題中描述的錯誤信息的代碼? – catchmeifyoutry 2009-12-10 01:09:27

+1

我的問題,雖然我沒有說清楚,但是: 爲什麼我會收到錯誤,指出「long」和「numpy.float64」類型是不兼容的。 有點取證想出了這個: 一個python整數變長,當它達到32位的長度。 Python長整數與'numpy.float64一起工作,直到python整數達到或超過長度爲64位的 ,然後發生錯誤。 所以我認爲這是一個錯誤 – 2009-12-10 16:02:24

1

這個工作對我來說:

for x in numpy.arange(1,6.4,.1): 
    eval("(1 + (2 * 3)/4) * numpy.sin(x)") 
相關問題