对于我的有关有限元分析输入数据的小数据挖掘项目,我已将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
不幸的是,这有几个问题:
[0.,0.,0.,0.]
行是否有任何快速灵活的方法可以执行此操作,也许已使用现有的numpy函数?什么是好的数据类型? 直接在PostgreSQL中更好吗?
谢谢。
答案 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;
应该更快,然后先导出未聚合的数据(多行),然后对其进行处理。