0

对于我的关于有限元分析的输入数据的小型数据挖掘项目,我已将 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. [0.,0.,0.,0.] 如果 id 范围有间隙,我会得到线条。(例如,当我有 element_ids 2、4、7 时......)

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

提前致谢。

4

1 回答 1

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;

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

于 2018-12-11T05:11:12.937 回答