Python: ~ 是如何用来排除数据的?

Python: How is a ~ used to exclude data?

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

我看到使用了“~”(又名按位不)。通过一些谷歌搜索,我对 ~ 的理解是它 returns 它传递的输入中每个位的倒数,例如,如果该位是 0,它 returns 是 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))]

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

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

~ 确实执行了按位不在 python 中的操作。但这里它用于对布尔值列表(或者更确切地说 pandas 系列)的每个元素执行逻辑非运算。有关示例,请参阅 this answer

让我们假设 collisions GeoDataFrame 包含点,但对于其他类型的几何图形,它的工作方式类似。 让我进一步更改代码:

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) returns 一个布尔值,指示点 x 是否在 my_union MultiPolygon 内。

  3. collisions["geometry"] 是包含点的 pandas 系列。

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

  5. ~ 然后否定这些布尔值,因此系列现在指示每个点是否 notmy_union.

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