Python:“不支持的操作数类型为+:'long'和'numpy.float64'”

Python:“不支持的操作数类型为+:'long'和'numpy.float64'”

问题描述:

我的程序使用遗传技术来构建等式。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

首先,您在示例中缺少右括号,并且(+ 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

这个工作对我来说:

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