我偶然发现了这个代码片段,但我不太明白它的含义,因为我不知道如何sum
一起map
工作lambda
。
radius = math.sqrt(sum(map(lambda x: x * x, map(lambda x, y: x - y, center, boundingBox[0]))))
有人可以解释一下吗?
我偶然发现了这个代码片段,但我不太明白它的含义,因为我不知道如何sum
一起map
工作lambda
。
radius = math.sqrt(sum(map(lambda x: x * x, map(lambda x, y: x - y, center, boundingBox[0]))))
有人可以解释一下吗?
让我们考虑欧几里得距离,根据定义,您在 3d 空间中得到了它:
d(a,b)=sqrt((b[0]-a[0])**2+(b[1]-a[1])**2+(b[2]-a[2])**2)
该 oneliner 的第一部分 math.sqrt(sum(map(lambda x: x*x, seq)) 是一种计算序列欧几里德距离的方法(python 可迭代)。
在这种情况下 seq 是什么?这只是boundingbox [0](即边界框宽度)和中心之间的向量减法,我假设它是你的3d网格的质心。
总而言之,那个丑陋的单线器是一种从中心和边界框计算边界球半径的讨厌方法。
比使用 map/lambda 函数更好,一个更清晰的计算方法,假设你在 3d 欧几里得空间中工作,会像这样重写 oneliner(明确地):
def bounding_sphere_radius(center, boundingbox):
v = [
center[0]-boundingbox[0][0],
center[1]-boundingbox[0][1],
center[2]-boundingbox[0][2]
]
return math.sqrt(v[0]**2+v[1]**2+v[2]**2)
另一种方式,如果您已经实现了自己的 3d 矢量类并且您已经覆盖了减法运算符 (-) 可能是这样的:
def bounding_sphere_radius(center, boundingbox):
v = [center[0]-boundingbox[0]]
return math.sqrt(v[0]**2+v[1]**2+v[2]**2)
或者最后,如果您在 3d 矢量类(欧几里德距离)中有一个长度方法,则更具可读性的内容将是:
def bounding_sphere_radius(center, boundingbox):
return (center[0]-boundingbox[0]).length()
python的禅说Readability counts.
;)
lambda是匿名函数,可以将它们视为行内函数。
我不知道这是否是一个恰当的比较,但类似于列表推导返回列表的方式。
map将函数应用于可迭代 input_list 中的所有项目(元组、字符串等)在这种情况下,它是元组。
因此,您可以通过打破括号来更好地在视觉上将其分解。
radius = math.sqrt(
sum(
map(lambda x: x * x, map(
lambda x, y: x - y, center, boundingBox[0]))))
这是其中之一,您必须从函数外部工作,然后再次退出,以完全了解正在发生的事情。
您使用第二个地图将中心和边界框传递给 lambda x,y: xy。在这个 lambda 中,您定义了两个参数 x 和 y,并且分别传入 center 和 boundingBox[0]。
您正在使用第一个映射将第二个 lambda 的结果传递给第一个 lambda。为此,您定义一个参数 x,并传入第二个 lambda 的结果。
然后你把它求和,然后取平方根。
所以在数学上,假设中心和边界框[0] 是元组形式的点,这个班轮正在做的是:
sqrt((X 2 - X 1 ) 2 + (Y 2 - Y 1 ) 2 )