Python双星号**幂运算符意外行为

时间:2017-07-25 20:37:41

标签: python

我编写了一个函数,通过近似两个变量(elev和MaxQ)之间的关系来替换scipy.interp1d,以加快我的代码速度。该等式是四阶多项式。我希望该函数能够计算单个输入和1D阵列输入的Q值。功能如下所示。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="heading">
  <img class="head" id="mainImg" src="https://placehold.it/50x50" alt="Know Music">
  <button class="head head2 font" href="" id="hb1">Guitar</button>
  <button class="head head2 font" href="" id="hb2">Bass</button>
  <button class="head head2 font" href="" id="hb3">Piano</button>
  <button class="head head2 font" href="" id="hb4">Drums</button>
</div>

答案如下:

def CalculateMaxFlow(elev):
    size=np.shape(elev)
    if size==():
        if (elev>367.8): #minimum elev for flow             
            return -0.00028194553726719*elev**4+0.284027992763652*elev**3-80.3765236558431*elev**2+1900880.72298153
        else: return 0
    else:
        MaxQ=np.zeros(np.shape(elev)[0])
        for i in range(np.shape(elev)[0]):
            if (elev[i]>367.8): #4th order polynomial. Not exact but okay for speeding up code              
                MaxQ[i]= -0.00028194553726719*((elev[i])**4)+0.284027992763652*((elev[i])**3)-80.3765236558431*((elev[i])**2)+1900880.72298153
            else: MaxQ[i]= 0               
        return MaxQ

elev1=380
elev5a=380+np.zeros(5)
elev5b=np.asarray([380,380,380,380,380])

Q1=CalculateMaxFlow(elev1)
print("Q1:"+ str(Q1))
Q2=CalculateMaxFlow(elev5a)
print("Q2:"+str(Q2))
Q3=CalculateMaxFlow(elev5b)
print("Q3:"+str(Q3))

Q1和Q2给出了我期望的答案。出于某种原因,Q3没有。我想知道为什么会这样。我在控制台中看到eleva和elevb之间的唯一区别是a是float64而b是int32。为什么这会改变等式的结果?那么为什么Q1(这是一个int)的结果是否也按预期工作?

1 个答案:

答案 0 :(得分:4)

使用Q3时,elev[i]numpy.int32个实例,elev[i]**4溢出。对于Q1,elev是Python int,elev**4使用任意精度算术。