【问题标题】:Evaluate all pairs of two meshgrids评估所有两个网格网格对
【发布时间】:2017-09-05 03:29:01
【问题描述】:

在一维中我可以轻松优雅地实现我想要的,但我无法将其转移到二维甚至更高维度

1-d

我有两个尺寸为 N = 3 的一维网格。

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

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

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

(为简洁起见,仅提供有趣的参数)

二维

现在在二维函数中乐趣保持不变。

我又有两个网格 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)。

编辑:完全修改了问题。

【问题讨论】:

  • 如何将输入展平为 1D,然后将其提供给 meshgrid?
  • 如果f() 采用两个一维向量,f( np.abs(mgrid[0] - mgrid[1]) ) 如何给出有用的输出?这是一个 2D 输入。
  • 另外,如果您不能直接告诉我们f() 是什么,请至少更清楚哪些输入和输出是什么形状和什么类型(arraytuplelist ),因为您的变量名称不断变化并且您的符号不清楚。在这种情况下,minimal reproducible example 将给出明确的输入(类型、数字和形状)、明确的预期输出(类型、数字和形状)以及给定“玩具”输入的预期输出样本。我敢肯定所有东西都在某个地方,只是现在很难找到。
  • 我修改了我的问题以使其更清晰。

标签: python numpy scipy


【解决方案1】:

可以使用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)

【讨论】:

    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2019-12-30
    相关资源
    最近更新 更多