python - 在 Python 中堆叠和计算矩形
问题描述
我有超过一百万个重叠的 2D 矩形(未旋转),我想将它们堆叠在一起并计数以形成热图/密度图/2D 直方图,显示哪些区域有更多的矩形,哪些区域有更少的矩形。理想情况下,我想在 Python 中执行此操作。从概念上讲,这是一个非常简单的问题,但我不确定如何有效地进行堆叠计算。
优化可能性
坐标存储在数据库中。因此,我可以简单地GROUP BY
将坐标降低到 ~300,000^ 个矩形,每个矩形都有一个值,表示它代表多少个矩形。然后问题稍微改变为堆叠矩形并将它们的值求和(不计算)之一。(^我可能会得到这个数字低很多,但这超出了这个问题的范围)
数据
矩形,定义为简单的左下角右上角坐标对。
[[0, 0], [300, 400]]
[[10, 30], [50, 35]]
[[243, 12], [244, 13]]
...
选项
我考虑了几个选项,但似乎没有一个好,因为他们使用 GIS 工具来解决不必要的 GIS 问题:
- 匀称的图书馆- 它并不是真的为此而设计的,因为我只是在堆叠/计算东西。
- 通过gdalcalc的GDAL - 特别是对值求和,但这会引入大量额外的工作来首先创建/管理数十万个栅格(甚至是虚拟栅格)。
- Numpy / Pandas或类似的东西?我以前从未使用过这些库,但是在谷歌上搜索这个问题时,它们出现了很多,尽管从来没有以一种看起来适用的方式出现。
- 将矩形转换为 1D 点的网格,然后简单地将它们输入
2dhist
. 非常低效。
那么,将大量重叠矩形转换为密度图的有效方法是什么?
解决方案
我已经用 numpy 做到了这一点。是的,它很丑,但它确实有效。
import numpy as np
import matplotlib.pyplot as plt
data = [[[0, 0], [300, 400]],
[[10, 30], [50, 35]],
[[143, 12], [244, 113]]] # I modified this for better visualization
values = [1, 3, 4] # if your rectangles have values
data_range = [1000, 1000] # assumed max data range is (0, 999)
areas = np.zeros(data_range) # initialize empty area
for i, points in enumerate(data):
areas[points[0][1]:points[1][1]+1, points[0][0]:points[1][0]+1] += values[i] # I agree that it's too ugly
# I use `+1` to take these points too
# change `values[i]` to `1` if it just needs counting
# visualize result
plt.imshow(areas)
plt.colorbar()
plt.show()
推荐阅读
- python - 关于变量范围的棘手 Python 问题
- python - 即时重新加载 Cython 模块
- azure - 如何将 Microsoft.WindowsAzure.Storage.Table.TableEntity 转换为 Microsoft.Azure.Cosmos.Table.TableEntity
- kotlin - 为什么只有协程的 main 中的 runBlocking 无法编译?
- node.js - NodeJS:从交互式控制台处理 Promise
- html - 用于隐藏纯文本的正确 CSS 选择器是什么?
- python - 谁能帮助解释为什么删除方括号会使函数正常工作?
- swiftui - SwiftUI - 条件文本
- sql - SQL 在查询结果中包含每第 n 条记录
- python - 我怎么知道我的直方图中的 x-label 和 y-label 在 python 中是什么?