在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)。
编辑:完全重写了这个问题。
答案 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)