Python 双星号 ** 幂运算符行为异常

标签 python

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

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:746.828053304
Q2:[ 746.8280533  746.8280533  746.8280533  746.8280533  746.8280533]
Q3:[ 6055481.13713196  6055481.13713196  6055481.13713196  6055481.13713196 6055481.13713196]

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

最佳答案

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

关于Python 双星号 ** 幂运算符行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45313075/

相关文章:

python - Flask-ReSTLess GET 请求抛出 SQLAlchemy 错误

仅首字母的名称的Python模糊匹配

python - Vim Flake8 忽略项目配置文件

android - 第一次运行 Bottle + Python + Google App 引擎

python - 动画在 matplotlib 上不起作用

python - libselinux-python 绑定(bind)和 ansible

python - 带分组依据的 Django haystack 自定义查询

python - Pytest-html:根据标记自定义报告标题

python - 如何使用正则表达式跳过文档字符串

Python:如何有效地检查一个项目是否在列表中?