2015-09-07 120 views
2

我正在尝试在Python 3中编写一个程序,它计算连续值之间绝对差值的平均值。Python中绝对差异的均值

+0

'r = sum_dif //(len(v)-1)'不应该在for循环的范围内。与'/'相反的''是整数除法。在你的例子中使用'/'更有意义,我想 – cel

+0

'//'是整数(“floor”)的分割,例如。 '0.7 // 10'会给你'0.0'。你只需要使用'/'。 – fjarri

回答

6

当编辑:由于代码已从问题中删除,请更新答案,将代码移至底部。

如评论中给出的,您可以使用enumerate()来获取索引以及数组中的元素,然后使用它来计算平均值。示例 -

>>> def absolute_difference(v): 
...  sum_diff = 0 
...  for i,x in enumerate(v): 
...   if i+1 < len(v): 
...    sum_diff += abs(v[i+1] - x) 
...  r = sum_diff/len(v) 
...  return r 
... 
>>> absolute_difference([4.0, 4.2, 4.1, 4.4, 4.3]) 
0.1400000000000004 

大量的代码问题(你似乎已删除) -

  1. 你为什么你的绝对差异转化为float?浮动数学不准确,你可以从你的代码中的差异总和中看到 - 0.20000000000000018。在你的情况下,你不需要将它们转换为浮动。

  2. ,因为使用的是//分发生的0.0r的主要问题,//截断划分为最接近的整数,所以潜水7.0的东西刨丝器比使用//总会导致0.0。示例 -

    >>> 7.0 // 8.0 
    0.0 
    >>> 7.0/8.0 
    0.875 
    

    对于你的情况,你应该使用划分/

  3. 您在循环的每次迭代中都采用了均值,但这不是问题,可能不是完全需要的。如果你不想在循环的每次迭代中使用mean,你应该在循环外部缩进它。

+0

OP需要成对的值,因此正在使用索引。他们应该'枚举',或者可以使用'itertools'中的['pairwise'](https://docs.python.org/2/library/itertools.html#recipes)配方。 –

+0

是的,好主意。更新了答案。 –

1

您正在使用//这意味着在python整数除法3

即)

2/4 =0.5 

2//4=0 

只需更换///计算ř

0

这里是另一种方法:

def absolute_difference(values): 
    last = values[0] 
    total = 0 

    for value in values[1:]: 
     total += abs(value - last) 
     last = value 

    return total/(len(values)-1) 

print('{:.5f}'.format(absolute_difference([4.0, 4.2, 4.1, 4.4, 4.3]))) 

给出答案:0.17500

0

另外,为了防止None从末出现,你必须在你的定义到底有return。如果您将另一个变量“等于”(=)作为您的定义,则会发生这种情况。这在其他帖子中已经显示,但我只是想强调一下。