python中的两个代码应该给出相同的结果,但它们不会

时间:2014-10-29 16:27:58

标签: python difference absolute-value

描述: 以下代码接收具有n维的两个点的坐标。它计算这两个点的manhanttan距离 代码:

def manhanttan( ponto1, ponto2 ):
    totalp1 = 0
    totalp2 = 0
    for x in range( 0, len( ponto1 ) ):
        totalp1 += ponto1[x]
        totalp2 += ponto2[x]
    return abs( totalp1 - totalp2 )

def manhanttan( ponto1, ponto2 ):
    total = 0
    for x in range( 0, len( ponto1 ) ):
        total += abs( ponto1[x] - ponto2[x] )
    return total

给出了不同的结果,我不知道为什么。有人可以帮帮我吗?

PS:列表中的所有值都是正数

PS2:第一个我的分类得到

K1: Expected Class: 6, Found Class: 0 K2: Expected Class: 6, Found Class: 0 K3: Expected Class: 6, Found Class: 0 K4: Expected Class: 6, Found Class: 0 K5: Expected Class: 6, Found Class: 0

和另一个我得到 K1: Expected Class: 6, Found Class: 6 K2: Expected Class: 6, Found Class: 6 K3: Expected Class: 6, Found Class: 6 K4: Expected Class: 6, Found Class: 6 K5: Expected Class: 6, Found Class: 6

3 个答案:

答案 0 :(得分:3)

为什么你认为他们应该是一样的?

考虑只汇总一个数字序列:

a = [1, -1, 1, -1, 1, -1]

如果你把绝对值作为总和,那么你实际上是在对序列求和:

a = [1, 1, 1, 1, 1, 1]

将导致总数报告为6。但是,如果你等到最后,要获取绝对值,你得到a0)之和,并取绝对值0

*注意 - 仅仅因为每个列表中的所有值都是正数并不意味着它们的差异。例如
ponto1[x] - ponto2[x]仍可能否定

答案 1 :(得分:1)

它不应该提供保存结果。

考虑p1 = [0,1]p2 = [1,0]

然后abs(sum(p1)-sum(p2))给出0,其中sum(abs(p1-p2))给出2。

总和的分布属性为您提供abs(sum(p1)-sum(p2)) == abs(sum(p1-p2)),因此一旦计算出总差异,您应该只取绝对值。

顺便说一下,sum是一个内置的python函数,完全按照你的想法行事。

答案 2 :(得分:0)

你的第二个功能是计算两个向量之间的曼哈顿距离,即每个单独维度相隔多远的总和。第一个函数在取得差异之前将每个向量减少为单个数字;假设所有坐标都是正的,这意味着它需要从origo到每个向量的曼哈顿距离,然后取这些坐标的差异。这是一个非常不同的功能!

考虑这对2D矢量:

y
5   a
4
3
2         b
1
0 o
  0 1 2 3 4 5 x

这里我们的原点是(0,0),a(1,5)和b(4,2)。要从a到b,我需要移动ba =(4-1,2-5)=(3,-3),总和为(map(abs,[3,-3]))= 6脚步。但是从o到a是6步,同样从o到b,所以减少第一种方法认为a和b相等,即使它们碰巧在相同的距离线上运行(6,0)和(0) ,6)(因为相当于一个圆的曼哈顿距离实际上是一个菱形,一个45°旋转的方形)。

相关问题