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')
你可以把它写成一句俏话,但这就是推动它。
添加回答
举报