两个numpy数组的平均差异

时间:2018-05-20 00:12:35

标签: numpy difference

我有两个一维NumPy数组XY。我需要计算X的每个元素与Y的每个元素之间的平均绝对差值。天真的方法是使用嵌套的for循环:

import numpy as np
np.random.seed(1)
X = np.random.randint(10, size=10)
Y = np.random.randint(10, size=10)

s = 0
for x in X:
    for y in Y:
        s += abs(x - y)
mean = s / (X.size * Y.size)
#3.4399999999999999

问题: NumPy是否提供此解决方案的矢量化,更快版本?

编辑:我需要平均绝对差异(总是非负面)。对不起,感到困惑。

3 个答案:

答案 0 :(得分:4)

如果我正确理解你的定义是什么,你可以使用广播。

np.mean(np.abs(X[:, None] - Y))

答案 1 :(得分:1)

一种方法是:

diff = X - Y
abs_diff = np.abs(diff)
mean_diff = np.sum(abs_diff) / (X.size * Y.size)

或更规范:

np.mean(X - Y)

采取绝对差异:

np.mean(np.abs(X - Y))

答案 2 :(得分:1)

如果你在相反的轴上平铺,那么你可以abs差异:

代码:

x = np.tile(X, (X.size, 1))
y = np.transpose(np.tile(Y, (Y.size, 1)))

mean_diff = np.sum(np.abs(x-y)) / (X.size * Y.size))

测试代码:

import numpy as np
X = np.random.randint(10, size=10)
Y = np.random.randint(10, size=10)

s = 0
for x in X:
    for y in Y:
        s += abs(x - y)
mean = s / (X.size * Y.size)
print(mean)

x = np.tile(X, (X.size, 1))
y = np.transpose(np.tile(Y, (Y.size, 1)))

print(np.sum(np.abs(x-y)) / (X.size * Y.size))

结果:

3.48
3.48