Python新手,不知道我的代码有什么问题

时间:2018-03-11 09:45:58

标签: python python-3.x numpy

我是Python的新手,所以请保持温和。

我真的不知道我的代码有什么问题。

这是:

import numpy as np

def epsilon(t):
    epsilon = (1 - np.exp(-pow(t, 4)))
    return epsilon

def r(t):
    r = pow( (epsilon(t) - 16) / 4, 1/4)
    return r

print(r(0))

epsilon(0) = 0开始,我希望(分析地)得到r =( - 16/4)^(1/4)=( - 1)^(1/4)* sqrt(2)= exp(i pi / 4)* sqrt(2)= 1 + 1 i

但我得到了:

RuntimeWarning: invalid value encountered in double_scalars
  r = pow((4 * epsilon(t) - 16) / 4, 1/4)
nan

我试图找到错误。如果我打印epsilon(0)我按预期得到0,如果我手动设置epsilon(0),如:

def r(t):
    r = pow( 0 - 16) / 4, 1/4)
    return r
print(r(0))

我得到1 + 1 j。如果我删除了to the power of 1/4,则可以使用-4

import numpy as np

def epsilon(t):
    epsilon = (1 - np.exp(-pow(t, 4)))
    return epsilon

def r(t):
    r = (epsilon(t) - 16) / 4
    return r

print(r(0))

那为什么呢

import numpy as np

def epsilon(t):
    epsilon = (1 - np.exp(-pow(t, 4)))
    return epsilon

def r(t):
    r = pow( (epsilon(t) - 16) / 4, 1/4)
    return r

print(r(0))

我收到此错误?

4 个答案:

答案 0 :(得分:3)

问题可能是由numpy浮动物引起的。 (由Schomes提供)。通过转换为'普通'浮动来修复。

import numpy as np

def epsilon(t):
    epsilon = (1 - np.exp(-pow(t, 4)))
    return epsilon

def r(t):
    epsi_boy = epsilon(t)
    print(type(epsi_boy)) # numpy float
    epsi_boy = float(epsi_boy) # Convert to non numpy float
    r = pow( (epsi_boy - 16) / 4,  1/4)
    return r

print(r(0))

答案 1 :(得分:1)

我注意到epsilon()返回的值是<class 'numpy.float64'>类型。当我们在Python的内置pow()函数中包含此值时,会出现问题。例如,尝试pow(np.float64(-4.0), 1/4);它也打破了。也许是因为这个原因:

  

对于混合操作数类型,二进制算术运算符的强制规则适用。   Built-in Functions: pow()

我设法通过将epsilon()的结果转换为float来解决问题。

r = pow( float((epsilon(t) - 16) / 4), 1/4)

答案 2 :(得分:1)

原因是numpy float64类似于c浮点数,并且会使所有操作(包括)的权限超载。这是exp返回的类型,随后在所有操作中返回。请注意,您正在尝试计算:

(-4)**(1/4)

这是一个虚数。 Python可以处理它,并输出结果,但numpy float64是&#34; real&#34;,所以上面是无效的表达式。因此,此处的所有答案都建议转换为float工作:

>>> (-4)**(1/4)
(1.0000000000000002+1j)
>>> np.float64(-4)**(1/4)
__main__:1: RuntimeWarning: invalid value encountered in double_scalars
nan

答案 3 :(得分:0)

from math import exp
def epsilon(t):
    epsilon = (1 - exp(-pow(t, 4)))
    return epsilon


def r(t):
    print(2)
    t=epsilon(t)
    r = pow( ( t- 16) / 4, 1/4)
    return r

print(r(0))

或者

from numpy import exp
def epsilon(t):
    epsilon = (1 - exp(-pow(t, 4)))
    return epsilon


def r(t):
    print(2)
    t=epsilon(t)
    r = pow( float( t- 16) / 4, 1/4)
    return r

print(r(0))