为了账号安全,请及时绑定邮箱和手机立即绑定

评估以列主顺序存储的函数

评估以列主顺序存储的函数

慕的地10843 2023-09-26 16:55:22
我正在尝试在离散点评估函数并按列主顺序存储,如下所示:import numpy as np; N = 3 ##n = N * Nh = 1 / (N + 1) # step sizeh2 = h**2  # deltaX = np.zeros(N)deltaY = np.zeros(N);def Function(x, y):    output = -20. * np.pi * np.sin(2 * np.pi * x) * sin(4 * np.pi * y)    return output    ## Equally spaced delta: for i in range(1, N + 1):     deltaX[i - 1] = i * h;     deltaY[i - 1] = i * h; ### Lexicographic Row order  ###### Evaluation of function at deltaX and deltaY feval = np.zeros((n, 1))我该如何评估该函数的离散化?
查看完整描述

1 回答

?
森林海

TA贡献2011条经验 获得超2个赞

好消息:您的函数正确使用 numpy 运算,因此完全矢量化。这意味着您可以在输入数组的每个元素处对其进行评估。


输入的形状不必完全匹配。他们只需一起广播即可。这意味着只有非单一维度需要匹配。


因此,首先创建适当的输入数组。Numpy 提供了无需循环即可优雅地完成此操作的工具:


N = 3

h = 1 / (N + 1)


delta_x = np.arange(1., N + 1.) * h

delta_y = np.linspace(h, N * h, N)[:, None]

我故意使用两种不同的方式来创建坐标数组,作为示例。在实践中,您需要使用这两种方法之一。


索引[:, None]变成delta_y列向量。None引入了新的单例轴。有许多其他方法可以做同样的事情,例如 `delta_y = ....reshape(-1, 1)。并阅读我链接到的文档以及我使用的所有功能。


现在您在 y 方向上有一列,在 x 方向上有一行,您可以Function这样调用


val = Function(delta_x, delta_y)

将二维矩阵排列成一维数组的操作val称为拆散。默认情况下,它使用 numpy 在内存中使用的默认行优先顺序。该顺序也称为“C”顺序。另一种安排是按列主顺序解释数组,就像 Matlab 所做的那样。这称为 Fortran 顺序。它将需要数据的副本,因为这不是元素在内存中的布局方式。


以 Fortran 顺序进行解释的一种方法:


feval = val.ravel(order='F')

另一种方法是转置并使用 C 顺序:


feval = val.T.ravel()

最后两行可以合并,因此最终得到 3 行:


delta_x = h * np.arange(1., N + 1.)

delta_y = h * np.arange(1., N + 1.)[:, None]

feval = Function(delta_x, delta_y).ravel(order='F')

你可以把它写成一句俏话,但这就是推动它。


查看完整回答
反对 回复 2023-09-26
  • 1 回答
  • 0 关注
  • 53 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信