评估所有两个网格对

时间:2017-09-05 03:29:02

标签: python numpy scipy

在1-d中,我可以轻松优雅地实现我想要的效果,但我无法将其转换为二维甚至更高维度

1-d

我有两个大小为N = 3的1-d网格。

a = [1, 2, 3]
b = [10, 20, 30]

现在我想在这些网格的所有对的差异/范数上评估函数的乐趣:

def fun(x):
    return x

mgrid = np.meshgrid( a,b )
A = fun( np.abs(mgrid[0] - mgrid[1] ) )

结果A的大小为N x N:

array([[ 9,  8,  7],
       [19, 18, 17],
       [29, 28, 27]])

|b[0]-a[0]| |b[0]-a[1]| |b[0]-a[2]|
|b[1]-a[0]| |b[1]-a[1]| |b[1]-a[2]|
|b[2]-a[0]| |b[2]-a[1]| |b[2]-a[2]|

(为了简洁起见,只是有趣的论据)

2-d

现在,二维功能乐趣保持不变。

我又有两个网格a和b

ax = [1, 2, 3]
ay = [4, 5, 6]
bx = [10, 20, 30]
by = [40, 50, 60]

a = np.meshgrid(ax, ay)
b = np.meshgrid(bx, by)

现在,我怎么能像上面的1-d网格那样做2-d,也可能做更高维度?

A的第一行:

|| (10 40) - (1 4) || || (10 40) - (1 5) || || (10 40) - (1 6) ||
|| (10 40) - (2 4) || || (10 40) - (2 5) || || (10 40) - (2 6) ||
|| (10 40) - (3 4) || || (10 40) - (3 5) || || (10 40) - (3 6) ||

(一行中的所有内容,再次只是有趣的论据)

结果网格的大小应为N * N x N * N.

我尝试创建a和b的坐标

ca = np.array(list(zip(a[0].flatten(), a[1].flatten())))
cb = np.array(list(zip(b[0].flatten(), b[1].flatten())))

从中创建一个meshgrid:

mgrid = np.meshgrid([ca], [cb])

但单独维度不适合(18而不是9)。

编辑:完全重写了这个问题。

1 个答案:

答案 0 :(得分:0)

可以使用scipy.spatial.distance_matrix完成。

def fun(x):
    return x

ax = [1, 2, 3]
ay = [4, 5, 6]
bx = [10, 20, 30]
by = [40, 50, 60]

a = np.meshgrid(ax, ay)
b = np.meshgrid(bx, by)
ca = np.vstack(a).reshape(2, -1).T
cb = np.vstack(b).reshape(2, -1).T
A = scipy.spatial.distance_matrix(ca, cb)
A = fun(A)

A的形状(9,9)