Эффективно рассчитать центр для каждого многоугольника в списке - PullRequest
0 голосов
/ 10 декабря 2018

Для моего небольшого проекта по интеллектуальному анализу входных данных для анализа методом конечных элементов я экспортировал результат 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, предпочтительно в массиве пустышек, вместе с данными.

Поскольку таблица довольно длинная (~ 3 млн. Строк), я ищу эффективныйАлгоритм вычисления среднего значения координат углов для каждого элемента.

До сих пор я планировал обновить i-й элемент массива numpy следующим образом:

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. Мне нужно знать самый высокий и самый низкий идентификатор (например, когда я выбираю только подмножество) элементов
  3. Я получаю [0.,0.,0.,0.] строк, если диапазон идентификаторов имеетпробел. (например, когда у меня есть element_ids 2,4,7 ...)

Есть ли быстрый и гибкий способ сделать это, возможно, с уже существующими функциями numpy?Какие бы хорошие типы данных для начала?Это лучше сделать прямо в PostgreSQL?

Заранее спасибо.

1 Ответ

0 голосов
/ 11 декабря 2018

Я ищу эффективный алгоритм для вычисления среднего значения координат углов для каждого элемента.

Сделайте это в Postgres прямо сейчас:

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

Должно быть на намного быстрее, чем сначала экспортировать неагрегированные данные (еще много строк), а затем обрабатыватьэто.

...