【问题标题】:Calculate center for each polygon in a list efficiently有效计算列表中每个多边形的中心
【发布时间】:2018-12-10 16:05:05
【问题描述】:

对于我的关于有限元分析的输入数据的小型数据挖掘项目,我已将 SQL 查询的结果导出到元素角(三角形等)的长 python 列表中。这是一些示例数据:

import numpy as np
#element_id, coordinates, data

corners = [(1, [-7.374797, -885.3285, 33.665], 1.0),
 (1, [-427.427897, -965.4985, 596.2296], 1.0), 
 (1, [-81.743197, -126.5385, 286.8912], 1.0),
 (2, [-22.248597, -878.7285, 111.239], 0.35), 
 (1, [-74.307097, -126.5385, 272.1152], 1.0),
 (2, [-74.307097, -126.5385, 286.8912], 0.35), 
 (2, [-81.743197, -126.5385, 286.8912], 0.35),  
 (3, [0.062103, -562.0245, 81.687], 1.25)]

列表中每个元组的第一个值是元素的id,第二个值是角的坐标。为了进一步处理,我需要每个 element 的中心,最好是在一个 numpy 数组中,连同数据。

由于表格很长(~3Mio.Lines),我正在寻找一种有效的算法来计算每个元素角坐标的平均值。

到目前为止,我的计划是通过以下方式更新 numpy 数组的第 i 个元素:

x = np.zeros((3,4)) #initialize array
for c in corners:
    x[c[0],1:] = (x[c[0],0]*x[c[0],1:] + c[1])/(x[c[0],0]+1) #recursive formula for mean
    x[c[0],0] +=1

不幸的是,这有几个问题:

  1. 很慢
  2. 我需要知道元素的最高和最低 id(例如,当我只选择一个子集时)
  3. 如果 id 范围有间隙,我会得到 [0.,0.,0.,0.] 行。(例如,当我的 element_ids 为 2、4、7...时)

是否有任何快速灵活的方法可以做到这一点,也许已经存在 numpy 函数?什么是好的数据类型开始? 直接在 PostgreSQL 中这样做更好吗?

提前致谢。

【问题讨论】:

  • 我发布了一个关于地理数据的类似问题。请注意,带有孔的多边形的重心可能不是您所期望的。 stackoverflow.com/questions/52467305/…
  • 谢谢。幸运的是,我的脸比你的要简单一些,也就是凸的。但我还有更多……
  • 我不了解您的 cmets 关于“最高和最低 id”和“差距”...

标签: python python-3.x numpy postgresql-11


【解决方案1】:

我正在寻找一种有效的算法来计算每个元素的角坐标的平均值。

立即在 Postgres 中执行:

SELECT element_id
     , ARRAY[avg(coordinates[1]), avg(coordinates[2]), avg(coordinates[3])]
FROM   tbl -- or your org. query here
GROUP  BY 1;

应该快得多,然后首先导出未聚合的数据(更多行)然后处理它。

【讨论】:

    猜你喜欢
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2014-06-30
    • 2013-11-14
    相关资源
    最近更新 更多