0

在下面的代码中,我知道它正在返回缓冲区之外的所有记录,但我对这是如何发生的机制感到困惑。

我看到有一个“~”(也就是按位不)正在使用。通过一些谷歌搜索我对〜的理解是它返回它传递的输入中每个位的倒数,例如,如果该位为0,则返回1。如果不是有人可以请ELI5,这是否正确?

有人可以解释一下以下代码如何返回“my_union”缓冲区之外的记录的实际机制吗?

注意:医院和碰撞只是地理数据框。

coverage = gpd.GeoDataFrame(geometry=hospitals.geometry).buffer(10000) 
my_union = coverage.geometry.unary_union 
outside_range = collisions.loc[~collisions["geometry"].apply(lambda x: my_union.contains(x))]
4

2 回答 2

0

我不确定你所说的实际机制到底是什么意思,如果没有看到输入和输出就很难确定,但如果有帮助,我会在下面解释它:

碰撞数据框中几何列中包含my_union中的任何值的所有行都将被排除在新创建的outside_range数据框中。

于 2020-04-12T23:09:38.350 回答
0

~确实在 python 中按位执行。但在这里,它用于对布尔值列表(或更确切地说是熊猫系列)的每个元素执行逻辑非。有关示例,请参见此答案。

让我们假设collisionsGeoDataFrame 包含点,但它对于其他类型的几何图形也同样适用。让我进一步更改代码:

coverage = gpd.GeoDataFrame(geometry=hospitals.geometry).buffer(10000) 
my_union = coverage.geometry.unary_union
within_my_union = collisions["geometry"].apply(lambda x: my_union.contains(x))
outside_range = collisions.loc[~within_my_union]

然后:

  1. my_union是单个(多)多边形。

  2. my_union.contains(x)返回一个布尔值,指示该点x是否在my_unionMultiPolygon 内。

  3. collisions["geometry"]是一个包含点的熊猫系列。

  4. collisions["geometry"].apply(lambda x: my_union.contains(x))my_union.contains(x)在这些点上运行。这将导致另一个熊猫系列包含布尔值,指示每个点是否在my_union.

  5. ~然后否定这些布尔值,因此 Series 现在指示每个点是否不在.my_union

  6. collisions.loc[~within_my_union]collisions然后选择条目所在的~within_my_union所有行True,即所有不在其中的点my_union

于 2020-04-23T18:46:08.477 回答