Получите весовые коэффициенты для средневзвешенного значения для наборов 3d-точек, число которых варьируется от 3 до N с использованием numpy - PullRequest
0 голосов
/ 19 октября 2018

Общая задача включает в себя n-гонов с 3 до N баллов.Есть точки относительно этих n-гонов.

Я пытаюсь заставить весы использовать средневзвешенное значение для перемещения точек с n-углами.

Если бы у меня были хорошие аккуратные группы треугольников, было бы проще.Numpy не любит работать с группами, которые различаются по количеству, но иногда есть способы обойти это.Например, я могу найти средневзвешенное значение для групп с разными числами, используя np.add.at с необычным индексированием, чтобы получить сумму для расчета.Я все еще получаю скорость numpy, но она работает в группах по 3, 4, 7 или что-то еще.Я пытаюсь найти метод для получения весов из отношений между точками и n-гонами в numpythonic пути.Средневзвешенное значение может быть вычислено примерно так, как показано ниже (я думаю, это правильная математика ...).У меня есть возможность генерировать индексные массивы без нуля, так что составьте список или что-то еще.

Если бы я работал с треугольниками, то «np.linalg.solve (tri.T, точка)» или «np.linalg.inv (tri.T) @ точка» дали бы мне веса.У меня нет такой роскоши, когда я работаю с несколькими точками и несколькими н-гонами.

import numpy as np
from numpy import newaxis as nax

# pretend these are a bunch of points in 3D space
n_gon_coords = np.random.randint(0, 50, 10 * 3)
n_gon_coords.shape = (10,3)

# pretend these are indices into the points that describe n-gons
ng_1 = [2, 3, 0]
ng_2 = [0, 1, 7, 6, 5]
ng_3 = [0, 3, 4, 1]
ng_4 = [0, 5, 9, 8, 2]

# put the indices into a 1d array so numpy can digest them
co_indexer = np.array(ng_1 + ng_2 + ng_3 + ng_4)
add_indexer = np.array([0,0,0] + [1,1,1,1,1] + [2,2,2,2] + [3,3,3,3,3])

# pretend these are the weights for the weighted average
weights = np.random.randint(0, 3, co_indexer.shape[0])

# allocate some arrays for summing the groups:
weight_sums = np.zeros(4)
coord_sums = np.zeros(4 * 3)
coord_sums.shape = (4, 3)

# multiply by weights:
weighted_coords = n_gon_coords[co_indexer] * weights[:, nax]

# sum for the average location:
np.add.at(coord_sums, add_indexer, weighted_coords)

# sum for the weights:
np.add.at(weight_sums, add_indexer, weights[co_indexer])

# location of weighted averages: (assuming I remembered the formula...)
weighted_averages = coord_sums / weight_sums[:, nax]
...