我有两个词典列表。第一个列表包含 x,y,z,radius 方面的球体定义。第二个列表包含空间中的各个点 x,y,z 。这些列表都很长,因此迭代每个列表并与所有值进行比较效率很低。
我一直在尝试使用地图并减少术语,但它们在过滤功能中只需要1个术语。我正在使用的是以下内容:
for curNode in nodeList:
for i in sphereList:
tmpRad = findRadius(i, curNode)
if float(tmpRad) <= float(i['radius']):
print "Remove node", curNode['num']
nodeRemovalList.append(curNode['num'])
break
其中i
是当前领域(x, y, z, rad)
,curNode
是节点(num, x, y, z)
。对于大型列表,这变得非常低效。我想过滤掉任何球体半径范围内的节点。
答案 0 :(得分:4)
试试这个:
def in_sphere(node):
return any(float(findRadius(sphere, node)) <= float(sphere['radius'])
for sphere in sphereList)
nodeRemovalList = filter(in_sphere, nodeList)
这比您显示的代码运行多。
这假设您实际上想要nodeRemovalList并且它不仅仅是一个中间步骤。如果它只是一个中间步骤,则返回not any(
,过滤器的结果将是您想要的设置。
另外,为什么sphere['radius']
不是浮动的?这会在一个非常庞大的列表上加快速度。
答案 1 :(得分:3)
您可能希望查看spatial octrees之类的内容,以减少必须检查每个点的球体数量。
答案 2 :(得分:2)
您是否正在尝试检测哪些点落入球体内。在numpy中使用基于矩阵的方法可能更容易,因为你可以有效地为所有点做一个3d距离向量,让p = point(x1,y1,z1)。设A为球心的阵列,则距离矢量阵列可以是计算机,并与numpy中的半径阵列进行比较。你会发现矩阵运算比迭代更快。