gpt4 book ai didi

python - 使用 numpy.meshgrid 定义二次函数

转载 作者:行者123 更新时间:2023-12-05 03:17:39 24 4
gpt4 key购买 nike

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

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

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 在“v1”上的所有值x v2”一次)?

如果我应该包含更多详细信息,请告诉我!

最佳答案

def quad(x, y, q):
"""Return an array A of a shape (len(x), len(y)) with
values A[i,j] = [x[i],y[j]] @ q @ [x[i],y[j]]
x, y: 1d arrays,
q: an array of shape (2,2)"""

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

请注意,a[i,j] == [x[i], y[j]]

关于python - 使用 numpy.meshgrid 定义二次函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74056454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com