【问题标题】:global name 'sqrt' not defined全局名称“sqrt”未定义
【发布时间】:2014-06-20 05:39:51
【问题描述】:

我创建了一个函数potential(x,K,B,N),其中x,K,Bnumpy 数组,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 *,但这似乎没有帮助。任何建议将不胜感激!

【问题讨论】:

    标签: python numpy ipython


    【解决方案1】:

    添加缺少的行:

    from numpy import sqrt 
    

    (或在非 NumPy 代码中 from math import sqrt。请注意,这是两个不同的函数:numpy.sqrt 也接受向量和数组,但普通 math.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()

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

    【讨论】:

    • 在使用函数之前我们总是需要{import}吗?在 R 中,即使您不使用其他包,您仍然可以通过先输入 {sqrt} 和 {import} 来使用一些内置函数?
    • @Phdaml: sqrt 不是 Python 中的内置函数,与 R 不同。所以在 Python 中是的,您需要 import mathfrom math import sqrt
    【解决方案2】:

    既然你标记了 numpy,

    import numpy as np
    

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

    【讨论】:

    • 我在发布此之前就这样做了。我很抱歉一开始没有说明这一点。
    【解决方案3】:

    你有几个选择:

    其他库:例如,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 函数。我在这里做了这个基准测试:

    为什么数学模块更高效? 数学模块使用平方根的 C 实现

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

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

    【讨论】:

      【解决方案4】:

      只需添加。

      from math import sqrt
      

      【讨论】:

      • 发帖前我也这样做了
      猜你喜欢
      • 2018-05-04
      • 2015-12-22
      • 2014-04-18
      • 2015-08-08
      • 2011-04-27
      • 2013-09-04
      • 2015-02-26
      • 2016-09-11
      相关资源
      最近更新 更多