我正在尝试计算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)
答案 0 :(得分:0)
不幸的是我不能评论你的问题要求解释因为我没有足够的声誉,所以我不得不作出一些假设。如果我错了,请随意纠正我。
我将假设dqu_18hr
和dqv_18hr
是存储两个不同函数u(t,y,x)和v(t,y,x)的值的数组。如果我理解正确,你想计算du / dx和dv / dy。
我不知道您在数组中存储的dx和dy值是什么,也因为您将它们定义为2D数组但将它们用作1D数组。我将假设dx
和dy
是您计算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相关联,这绝对合法但不常见,因此您可能需要检查这是否是错误。