ArcMap Python Field Calculator与Python的工作方式不同

时间:2017-05-17 14:05:51

标签: python esri arcmap

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

  • 有两个输入变量,分子和分母
  • 如果分子为零,则返回零
  • 否则,分子除以分母并乘以100

我试过的代码:

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

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

分母中没有零,所以div / 0不会成为问题。输入字段都是“长”整数,目标字段是“double”。

我附上了一些图片,显示了python中的测试,其中完全相同的代码完美无缺,以及不起作用的字段计算器。

enter image description here enter image description here

2 个答案:

答案 0 :(得分:0)

这不是你想要的吗? 如果你一步一步这样做:

healthy = 1
total = 10

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

return (healthy / total) * 100

等于

return (1 / 10) * 100

然后等于:

return (0.1) * 100

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

答案 1 :(得分:0)

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

  

ArcGIS Pro使用Python 3,在ArcGIS Desktop中,它使用Python 2.Python 2使用整数数学,这意味着划分两个整数值将始终产生一个整数值(3/2 = 1)。在Python 3中,除以两个整数值将产生一个浮点数(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

一个观察结果:你的条件基本上是说"如果分子为零,不要分开,只需返回零" - 然而,无论如何,除以任何东西的是0。你可以跳过条件和整个代码块,直接计算 - 但仍然记得先将值转换为float,否则你仍会得到一堆零:)

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