【问题标题】:Calculating wind gradient du_dx, dv_dy using np.gradient使用 np.gradient 计算风梯度 du_dx, dv_dy
【发布时间】:2018-09-05 20:01:44
【问题描述】:

我正在尝试计算给定 u-wind 和 v-wind 的风梯度。 u 和 v 值具有以下形状的 3d 数组:

u(122,9,9) 使得 u(时间,纬度,经度)。这同样适用于 v。

我还计算了 dx 和 dy 值(在 lat 和 lon 方向的二维数组中)

我的代码示例如下,例如时间 0:

dudx = np.gradient(u[0,0,:], dx[0,0], edge_order=2)
dvdy = np.gradient(v[0,:,0], dy[0,0], edge_order=2)

然后我可以对 dudx 和 dvdy 求和以获得渐变。我有一个已经计算出散度的数据,在将我的计算与散度数据进行比较后,我预计这些值是相同的,但事实并非如此。除了错误地使用 np.gradient 函数之外,我似乎无法弄清楚我哪里出错了。

我想知道我上面计算 u 和 v 风梯度的方法是否正确。

干杯。

编辑

我用来计算风梯度的完整代码如下:

dqu_dx = np.zeros((122,9,9))
dqv_dy = np.zeros((122,9,9))


for i in range(122):
    for j in range(9):
        for k in range(9):
            dqu_dx[i,j,:] = np.gradient(dqu_18hr[i,j,:], dx[0,k], edge_order=2)
            dqv_dy[i,:,k] = np.gradient(dqv_18hr[i,:,k], dy[j,0], edge_order=2)

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    很遗憾,我无法对您的问题发表评论以寻求解释,因为我没有足够的声誉,所以我不得不做出一些假设。如果我错了,请随时纠正我。

    我假设dqu_18hrdqv_18hr 是存储两个不同函数值的数组,u(t, y, x) 和 v(t, y, x)。如果我理解正确,您想计算 du/dx 和 dv/dy。

    我不知道您存储在数组中的 dx 和 dy 值是什么,还因为您将它们定义为二维数组但将它们用作一维数组。我将假设 dxdy 是您计算 u 和 v 的点的坐标,并且它们生成的网格是规则的。

    您的代码的第一个问题是您将单个标量数字作为 np.gradient 的第二个参数传递。完成后,numpy 假定这是点之间的距离。然而,这个距离在每次迭代时都会发生变化。我可以想到一个非常复杂的情况,其中 dx 的定义使得它给出了正确的结果,但通常这是一个错误。

    代码的另一个问题是它没有利用 numpy 向量化,显式使用三个 for 循环。这在计算上是非常低效的。

    我建议你使用以下代码:

    x = dx[0, :]  # or whatever is the correct definition
    y = dy[:, 0]  # not enough info in the post to understand it
    
    a = np.gradient(dqu_18hr, x, axis=2, edge_order=2)
    b = np.gradient(dqv_18hr, y, axis=1, edge_order=2)
    

    还请注意,在您的代码中,x 与轴 2 关联,y 与轴 1 关联,这绝对合法但不寻常,因此您可能需要检查这是否是错误的。

    【讨论】:

      猜你喜欢
      • 2015-11-27
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      相关资源
      最近更新 更多