在科学空间这里有Delaunay函数。文档包括example of how to calculate barycentric coordinates.
下面的代码将使用循环计算重心坐标。你知道吗
points = np.array([(0,0),(0,1),(1,0),(1,1)])
samples = np.array([(0.5,0.5),(0,0),(0.1,0.1)])
dim = len(points[0]) # determine the dimension of the samples
simp = Delaunay(points) # create simplexes for the defined points
s = simp.find_simplex(samples) # for each sample, find corresponding simplex for each sample
b0 = np.zeros((len(samples),dim)) # reserve space for each barycentric coordinate
for ii in range(len(samples)):
b0[ii,:] = simp.transform[s[ii],:dim].dot((samples[ii] - simp.transform[s[ii],dim]).transpose())
coord = np.c_[b0, 1 - b0.sum(axis=1)]
这对于将短样本列表转换为重心坐标是可以的,但是对于非常大的样本列表,性能很差。如何修改它以利用numpy/scipy中的矢量化数学来提高性能?你知道吗
考虑以下修改(对于用numpy方法替换的循环):
测试用例:
结果:
对于修改后的版本,行
simp.find_simplex(samples)
给出了大约95%的运行时间。所以,我想你对矢量化没有别的办法了。为了进一步提高性能,您需要find_simplex
方法的另一个实现或解决问题的另一种方法。你知道吗相关问题 更多 >
编程相关推荐