ArcMap Python 字段计算器与 Python 的工作方式不同
ArcMap Python Field Calculator does not work the same as Python
我正在尝试使用 ArcMap 中的 python 字段计算器进行简单计算,其中:
- 有两个输入变量,分子和分母
- 如果分子为零,则返回零
- 否则,分子除以分母再乘以100
我试过的代码:
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!)
我正在尝试使用 ArcMap 中的 python 字段计算器进行简单计算,其中:
- 有两个输入变量,分子和分母
- 如果分子为零,则返回零
- 否则,分子除以分母再乘以100
我试过的代码:
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!)