两个numpy数组的平均绝对差

6

我有两个一维的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是否提供了这个解决方案的向量化、更快的版本?

修改后:我需要平均绝对差(始终为非负数)。对于混淆造成的困惑,我感到很抱歉。


为了方便起见,我认为在生成随机数组时设置种子np.random.seed(1)通常是有帮助的 - 这样答案可以精确地复现您的结果。 - Gene Burinsky
@GeneBurinsky 好的,没问题。 - DYZ
1
房间里的大象就是你的代码会生成排名为1的数组,例如(10,)。因此,miradulo的代码对于这种类型的数组产生了与你的代码相同的结果。但是,如果你的数组形状不同(例如2x5),那么结果会非常不同。 - KRKirov
1
@KRKirov 一般来说,你是正确的。但这就是我说我的数组是线性(一维)的原因。让我在问题中澄清这一点。 - DYZ
3个回答

5

如果我正确地理解了你这里的定义,你可以直接使用广播。

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

4

计算差值,然后取绝对值,再求平均值:

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

或者:

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

不错!但我需要平均绝对差(始终为非负数)。抱歉造成困惑。我认为你的解决方案无法扩展到处理abs()。 - DYZ
@DyZ 只需在任何不同的差分子句中添加 np.absnp.abs(X-Y)np.mean(np.abs(X-Y)) - Gene Burinsky
@GeneBurinsky 不,它们不一样。 - DYZ
很遗憾,这不是一样的。取X=array([8, 4, 6, 0, 9, 2, 3, 2, 9, 4])Y=array([4, 0, 1, 8, 4, 9, 2, 5, 7, 7])。你的方法得到了4.2,而真正的平均值是3.4。abs()和mean()不可交换。 - DYZ
1
@DyZ 公平。我想我们误解了,因为我们假设两个数组之间的差异,而实际上你想要问的是 X 中每个元素与 Y 中每个元素之间的差异。 - Gene Burinsky

2
如果你在相反的轴上平铺,那么可以使用以下代码对差值进行绝对值计算: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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接