Python 计算两个网格的所有对

Python 计算两个网格的所有对,python,numpy,scipy,Python,Numpy,Scipy,在1-d中,我可以轻松优雅地实现我想要的,但我无法将其转换为2-d甚至更高维度 1-d 我有两个大小为N=3的一维网格 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],

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

1-d

我有两个大小为N=3的一维网格

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)
现在,我怎样才能像上面的一维网格一样处理二维,甚至更高维的网格呢

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())))
并从中创建网格网格:

mgrid = np.meshgrid([ca], [cb])
但单凭维度是不合适的(18而不是9)


编辑:完全修改了问题。

可以使用
scipy.space.distance\u矩阵来完成

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)

如何将输入展平到1D,然后将其馈送到网格网格?如果
f()
采用两个1D向量,那么
f(np.abs(mgrid[0]-mgrid[1])
如何提供有用的输出?这是一个2D输入。如果您不能直接告诉我们什么是
f()
,请至少更清楚地了解什么是输入和输出,什么是形状和类型(
array
tuple
list
),因为您的变量名不断变化,您的符号也不清楚。在这种情况下,A将给出清晰的输入(类型、数字和形状),清晰的预期输出(类型、数字和形状),并带有给定“玩具”输入的预期输出样本。我确信所有的东西都在某个地方,现在真的很难找到。我修改了我的问题,让它更清楚。