如何找到Python列表中所有数字之间差异的平均值

Asa*_*ain 20 python numpy average mean

我有一个像这样的Python列表,

arr = [110, 60, 30, 10, 5] 
Run Code Online (Sandbox Code Playgroud)

我需要做的实际上是找到每个数字与所有其他数字的差异,然后找到所有这些差异的平均值。

因此,对于这种情况,它将首先找到 之间的差异110,然后找到所有剩余元素 ie 之间的差异,然后它将找到与剩余元素 ie等之间60, 30, 10, 5的差异。6030, 10, 5

之后,它将计算所有这些差异的平均值。

现在,这可以通过两个 For 循环轻松完成,但O(n^2)时间复杂度较高,而且代码也有点“混乱”。我想知道是否有更快、更有效的方法来做同样的事情?

Qua*_*ang 36

我先给出公式:

n = len(arr)
out = np.sum(arr * np.arange(n-1, -n, -2) ) / (n*(n-1) / 2)
# 52
Run Code Online (Sandbox Code Playgroud)

说明:你想要找到的平均值

a[0] - a[1], a[0] - a[2],..., a[0] - a[n-1]
             a[1] - a[2],..., a[1] - a[n-1]
                         ...
Run Code Online (Sandbox Code Playgroud)

在那里,你的

`a[0]` occurs `n-1` times with `+` sign, `0` with `-` -> `n-1` times
`a[1]` occurs `n-2` times with `+` sign, `1` with `-` -> `n-3` times
... and so on 
Run Code Online (Sandbox Code Playgroud)

  • 基本的 Python 等效项是 `out = sum(x*j for x, j in zip(arr, range(n-1, -n, -2)))/(n*(n-1)/2)`。 (6认同)

Abo*_*mar 8

不像@QuangHoang的答案那么出色,这个答案使用numpy广播来计算差异矩阵,然后对上三角值进行平均以获得答案。

import numpy as np

a = np.array([110, 60, 30, 10, 5])

dif = np.triu(a.reshape(len(a),-1) - a)
out = np.mean(dif[dif != 0])
52.0
Run Code Online (Sandbox Code Playgroud)


Ste*_*tef 5

现在,这可以通过两个 For 循环轻松完成,但O(n^2)时间复杂度较高,而且还需要一些messy代码。

不需要让代码变得混乱。

from statistics import mean

arr = [110, 60, 30, 10, 5]

m = mean(arr[i] - arr[j] for i in range(len(arr)) for j in range(i+1, len(arr)))

print(m)
# 52
Run Code Online (Sandbox Code Playgroud)

如果数组未排序,则替换arr[i] - arr[j]abs(arr[i] - arr[j])