全局名称'sqrt'未定义。

8

我创建了一个名为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 *,但好像没有起作用。如有建议,将不胜感激!
5个回答

20

添加缺失的行:

from numpy import sqrt 
< p>(或在非NumPy代码中使用from math import sqrt。请注意,这是两个不同的函数:numpy.sqrt还接受向量和数组,但纯math.sqrt不接受)

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

(可能您在定义该函数后才这样做。无论如何,请放心,只需在干净的会话中重新加载代码即可解决问题。)

更新:

  • 严格来说,在Python中,您应该执行import package而不是from package import identifier1 [,identifier2,identifier3 ...] 绝不要 from package import *。但是,如果明智使用,局部地在函数内部,from package import identifier1是可以的。如果它是明确的,并且您将要大量使用它,它可以缩短代码,例如sqrt()而不是math.sqrt()log而不是math.log10()

  • sqrt不是Python中的内置函数,不像R。因此,在Python中,您需要使用from numpy import sqrtimport mathfrom math import sqrt才能使用它。


我们在使用函数之前是否总是需要{import}?在R中,即使您不使用其他包,只需先键入{import},就可以使用一些内置函数,例如{sqrt}。 - MLE
@Phdaml:与R不同,Python中没有内置的sqrt函数。因此,在Python中,您需要使用import mathfrom math import sqrt - smci

1

既然您标记了numpy,

import numpy as np

然后使用np.sqrt而不是sqrt。总是有效的。

我在发布这篇文章之前就已经做过了。很抱歉一开始没有说明。 - user3758890

1

你有几个选择:

使用额外的库,例如NumPy

import numpy as np

"

然后使用 np.sqrt(9)

或者

"
from numpy import sqrt
sqrt(9)

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

1) 9**0.5

2)

import math
math.sqrt(9)

or

from math import sqrt
sqrt(9)

对于后面的部分,出于性能原因,我更喜欢使用math函数。我在这里进行了基准测试:

enter image description here

为什么math模块更高效? math模块使用C实现的平方根。
我的基准测试代码可以在此处找到:

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


0

只需添加。

from math import sqrt

我在发布之前也做了这件事 - user3758890

0

有两个选项,第一个是使用 sqrt() 函数从 math 模块中导入所有内容 否则,可以使用 import math 导入 math 模块并使用 math.sqrt() 函数


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接