我有一个nx3numpy数组,列出了一个曲面的N个三角形面的3个顶点,还有一个Nx1数组,其中的每个面对应一个值。你知道吗
我想将这些“面”值转换为“顶点”值(尽可能最好),例如通过查找与顶点关联的所有面的平均值。你知道吗
我目前的解决方案适用于较小的N值,但缩放为面数x顶点数,这很快变得不切实际:
def face2vertVal(faces, facesVals, verts):
# INPUT:
# faces: Nx3 array of N vertex IDs for N faces
# facesVals: Nx1 array of some parameter for each face
# OUTPUT:
# vertsVals: Px1 array of the mean value in "facesVals" that corresponds
# to each vertex
import numpy as np
vertsVals = np.zeros(faces.max()+1)
for vertex in range(0, faces.max()+1):
tmpVals = np.zeros(1)
for row in range(0, faces.shape[0]):
if faces[row].__contains__(vertex):
tmpVals = np.append(tmpVals, facesVals[row])
vertsVals[vertex] = tmpVals[1:].mean()
del tmpVals
return vertsVals
提前谢谢。你知道吗
编辑:矢量化的方法非常快,但是对于700k个面和350k个顶点需要太多的内存。你知道吗
您的代码有一些对性能有很大影响的问题(例如,不使用np.附加在循环中)。 因此,第一步是改进代码,同时避免不必要的搜索。你知道吗
在下一步中,我们可以使用jit编译器来获得额外的性能。你知道吗
代码
性能
编辑:
如果内存有问题,也可以使用“批处理”版本的算法,一次只处理有限数量的面:
将numpy作为np导入
您可以手动选择
batch_size
(或者根据要使用的内存或其他内容使用一些公式)来平衡速度和内存之间的平衡。你知道吗你应该以矢量化的方式进行计算,否则会慢得多。这是一种方法:
请注意,这种方法的缺点是,给定具有
P
顶点的N
面,它需要O(N*P)
内存,而非矢量化算法使用O(max(N, P))
内存。你知道吗相关问题 更多 >
编程相关推荐