有效地计算列表中每个多边形的中心

时间:2018-12-10 16:05:06

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

对于我的有关有限元分析输入数据的小数据挖掘项目,我已将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。行),因此我正在寻找一种有效的算法来计算每个元素的角坐标平均值。

到目前为止,我的计划是通过以下方式更新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和最低ID(例如,当我仅选择一个子集时)
  3. 如果id范围有间隔(例如,当我有element_ids 2,4,7 ...时),我会得到[0.,0.,0.,0.]

是否有任何快速灵活的方法可以执行此操作,也许已使用现有的numpy函数?什么是好的数据类型? 直接在PostgreSQL中更好吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

  

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

立即在Postgres中执行此操作:

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

应该更快,然后先导出未聚合的数据(多行),然后对其进行处理。