全局名称'sqrt'未定义

时间:2014-06-20 05:39:52

标签: python numpy ipython

我创建了一个功能potential(x,K,B,N),其中xKBnumpy数组,N为整数。我试图在iPython中测试该功能,但我一直收到错误"global name 'sqrt' not defined"

在这里查看我的代码:

def potential(x,K,B,N):

    x = x.reshape((3,N),order='F')

U_b = 0.0
for i in xrange(0,N-1):
    for j in xrange(i+1,N):
        if K[i,j] == 1.0:
            U_b += sum((x[:,i]-x[:,j])**2)
U_b = 0.5*U_b

U_a = 0.0
for i in xrange(0,N-2):
    for j in xrange(i+1,N-1):
        for l in xrange(j+1,N):
            if B[i,j,l] == 1.0:
                U_a += B[i,j,l]*sum((x[:,i]-x[:,j])*(x[:,j]-x[:,l]))/(sqrt(sum((x[:,i]-x[:,j])**2))*sqrt(sum((x[:,j]-x[:,l])**2)))
U_a = -U_a

U_r = 0.0
d = 0.0
for i in xrange(0,N-1):
    for j in xrange(i+1,N):
        d = sqrt(sum((x[:,i]-x[:,j])**2))
        if d > sqrt(0.2):
            U_r += (1.0/6.0)*(1/(d**6))
        else:
            U_r += -0.2**(-7.0/2.0)*d + (7.0/6.0)*(0.2)**(-3)

return U_b + U_a + U_r

我已尝试使用from math import *,但似乎没有帮助。任何建议将不胜感激!

4 个答案:

答案 0 :(得分:6)

from math import sqrt

缺少所有

  

我尝试过使用from math import *,但似乎没有帮助。

(可能你在定义函数后就这样做了。无论如何,fuhgeddaboutit,只需在干净的会话中重新加载代码,它就可以工作。)

更新:严格地说,在Python中你应该import package而不是from package import identifier1 [,identifier2, identifier3...]永远不会 from package import *。但是from package import identifier1在明智地使用时,如果你没有过度使用,并且在函数内部,则可以。如果它是明确的,并且你将会做很多,它会缩短代码,例如sqrt()代替math.sqrt()log代替math.log10()

答案 1 :(得分:1)

因为你标记了numpy,

import numpy as np

然后使用np.sqrt代替sqrt。永远有效。

答案 2 :(得分:0)

只需添加。

from math import sqrt

答案 3 :(得分:0)

你有几个选择:

其他图书馆:例如,NumPy

import numpy as np

然后使用np.sqrt(9)

from numpy import sqrt
sqrt(9)

或标准库和内置解决方案:

1) 9**0.5

2)

import math
math.sqrt(9)

from math import sqrt
sqrt(9)

对于后一部分,出于性能原因,我更喜欢math函数。我在这里做了这个基准:

enter image description here

为什么数学模块更有效? math模块使用平方根

的C实现

我的基准测试代码可以在这里找到:

http://nbviewer.ipython.org/github/rasbt/One-Python-benchmark-per-day/blob/master/ipython_nbs/day8_sqrt_and_exp.ipynb?create=1