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的值它失败了。
首先,您在示例中缺少右括号,并且(+ 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
编辑
是啊,遗传编程,解释你想要做什么;)
根据您的更新的信息,我不得不猜测,您的字符串建设有时莫名其妙地出现故障。 更改您的代码以显示导致引发异常的字符串。最简单的方法是在调用eval之前打印字符串,并在抛出异常时可以看到最后一个等式是什么。 然后,如果不清楚它有什么问题,可以在这里发布这个公式。
是的,它让人困惑。我希望我的编辑能够清除它。 – 2009-12-10 00:22:20
好的,但新的问题陈述只是不运行。如果你将数学引入到引号中,按照eval的要求(见bluce的答案),那么我不会有任何错误。你能不能给出重现问题标题中描述的错误信息的代码? – catchmeifyoutry 2009-12-10 01:09:27
我的问题,虽然我没有说清楚,但是: 为什么我会收到错误,指出“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)")
恢复良好,到目前为止彼得。顺便说一句,你说“类型(numpy.sin(1))”返回numpy.float64 ...可能是一个红色的鲱鱼。尝试“type(x)”,在循环中...你会看到x也是一个numpy.float64。也许知道这将帮助你找到与真正长期不匹配的地方。 – 2009-12-10 01:37:35
@彼得汉森:谢谢彼得,我会研究一下 – 2009-12-10 02:57:40