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)
不像@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)
现在,这可以通过两个 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])。