使用np.gradient计算风梯度du_dx,dv_dy

时间:2018-03-27 12:04:53

标签: python numpy

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

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

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

我的代码示例如下所示,例如:

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)

1 个答案:

答案 0 :(得分:0)

不幸的是我不能评论你的问题要求解释因为我没有足够的声誉,所以我不得不作出一些假设。如果我错了,请随意纠正我。

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

我不知道您在数组中存储的dx和dy值是什么,也因为您将它们定义为2D数组但将它们用作1D数组。我将假设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相关联,这绝对合法但不常见,因此您可能需要检查这是否是错误。