【问题标题】:Defining a quadratic function with numpy.meshgrid用 numpy.meshgrid 定义二次函数
【发布时间】:2022-10-13 23:01:41
【问题描述】:

让我们考虑两个变量 f(x1, x2) 的函数,其中 x1 跨越向量 v1x2 跨越向量 v2

如果f(x1, x2) = np.exp(x1, x2),我们可以在 Python 中通过命令 numpy.meshgrid 将这个函数表示为一个矩阵,如下所示:

xx, yy = numpy.meshgrid(v1, v2)
M = numpy.exp(xx + yy)

这样,M 是函数f 在笛卡尔积“v1 x v2”上的表示,因为M[i,j] = f(v1[i],v2[j])

但这是可行的,因为总和和指数都以并行方式工作。我的问题是

如果我的变量是x = numpy.array([x1, x2]) 并且f 是二次函数f(x) = x.T @ np.dot(Q, x),其中Q 是一个2x2 矩阵,我怎样才能对meshgrid 函数做同样的事情(即计算函数f on “v1 x v2”一次)?

如果我应该包括更多细节,请告诉我!

【问题讨论】:

  • np.exp(x1, x2)? numpy.exp(xx + yy)?哪一个?
  • 当您可以使用广播时,您为什么使用meshgrid

标签: python numpy optimization linear-algebra tensor


【解决方案1】:
def quad(x, y, q):
    from numpy import array, meshgrid, einsum
    a = array(meshgrid(x, y)).transpose()
    return einsum('ijk,kn,ijn->ij', a, q, a)

笔记:

meshgrid 产生 2 个形状为 (len(y), len(x)) 的数组,其中第一个数组是沿第二维的 x 值。如果我们应用到这对np.array,那么将生成一个形状为(2, len(y), len(x)) 的3d 数组。使用transpose,我们得到一个数组,其中[i,j,k] 索引的元素是x[i] if k==0 else y[j],其中k 是0 或1,即来自meshgrid 的第一个或第二个数组。

使用'ijk,kn,ijn->ij',我们告诉einsum 返回下面写的每个i, j 的总和:

sum(a[i,j,k]*q[k,n]*a[i,j,n] for k in range(2) for n in range(2))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2015-07-12
    相关资源
    最近更新 更多