两个numpy阵列的平均差

两个numpy阵列的平均差,numpy,difference,Numpy,Difference,我有两个一维NumPy数组X和Y。我需要计算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 *

我有两个一维NumPy数组
X
Y
。我需要计算
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是否提供此解决方案的矢量化、更快版本

编辑:我需要平均绝对差值(始终为非负)。很抱歉造成混淆。

一种方法是:

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))

如果在相反的轴上平铺,则可以
abs
diff-like:

代码: 测试代码: 结果:
如果我正确理解你的定义,你可以使用广播

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

整洁的但是我需要平均绝对差(总是非负的)。很抱歉给你带来了困惑。我不认为您的解决方案可以扩展到处理abs()。@DyZ只需在任何区分子句中添加
np.abs
np.abs(X-Y)
np.mean(np.abs(X-Y))
@GeneBurinsky不,这不一样。不幸的是,这不一样。取
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-fair。我想我们误解了,因为我们假设了两个数组之间的差异,而您实际上想问的是
X
中的每个元素与
Y
中的每个元素之间的差异。为了方便起见,我认为设置种子
np.random.seed(1)通常是有帮助的
每当我们生成随机数组时——这样答案就能准确地重现您的结果。@GeneBurinsky很公平。房间里的大象是您的代码生成排名1的数组,例如(10,)。因此,miradulo的代码生成的结果与此类型数组的代码相同。但是,如果你的数组是一个不同的形状(例如2x5),那么结果就会非常不同。@KRKirov总的来说,你是对的。但这就是为什么我说我的数组是线性的(一维的)。让我在问题中澄清这一点。
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
np.mean(np.abs(X[:, None] - Y))