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

时间:2009-12-09 23:51:52

标签: python numpy

我的程序使用遗传技术来构建方程式。

它将字符串随机组合成一个未知的方程式。

"(((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'子句捕获。 错误消息是“不支持的操作数类型+:'long'和'numpy.float64'”

当我尝试“type(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值。

2 个答案:

答案 0 :(得分: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之前打印字符串,并且当抛出异常时,您可以看到最后的等式是什么。 然后,如果不清楚它有什么问题,你可以在这里发布这个等式。

答案 1 :(得分:1)

这对我有用:

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