ArcMap Python 字段计算器与 Python 的工作方式不同

ArcMap Python Field Calculator does not work the same as Python

我正在尝试使用 ArcMap 中的 python 字段计算器进行简单计算,其中:

我试过的代码:

def getScore(num, den):
    if num == 0:
        return 0
    else:
        return (num/den) * 100

当我 运行 脚本时,我没有收到任何错误,但 'else' 语句没有返回。

分母中不会有零,所以 div/0 不会有问题。输入字段都是 'long' 整数,目标字段是 'double.'

我附上了几张图片,显示了在 python 中进行的测试,其中完全相同的代码可以完美运行,而字段计算器却无法运行。

这不就是你想要的吗? 如果你一步一步来:

healthy = 1
total = 10

当然健康不是 0,所以它进入 else 块:

return (healthy / total) * 100

等于

return (1 / 10) * 100

然后等于:

return (0.1) * 100

这是10,就像你在屏幕截图中看到的那样。

The way ArcGIS Desktop divides integers will result in an integer,因此百分比将始终为零(例如 1 / 10 = 0)——烦人且违反直觉,但这就是它正在做的事情。

ArcGIS Pro uses Python 3 and in ArcGIS Desktop, it uses Python 2. Python 2 uses integer math, meaning that dividing two integer values will always produce an integer value (3 / 2 = 1). In Python 3, dividing two integer values will produce a float (3 / 2 = 1.5).

您可以将变量显式转换为 float,然后进行浮点除法并给出浮点结果 (1 / 10 = 0.1)。以下对我有用:

def getScore(num, den):
    if num == 0:
        return 0
    else:
        return (float(num)/float(den)) * 100

一个观察:你的条件基本上是说 "if the numerator is zero, don't bother dividing, just return zero" - 然而,这就是 0 除以任何值的结果。您可以跳过条件和整个代码块,直接计算——但仍然记得先将值转换为浮点数,否则您仍然会得到一堆零:)

float(!Healthy!) / float(!Total!)