首页 > 解决方案 > 如何在多维数据上使用 np.gradient?

问题描述

这方面存在很多问题,但我找不到描述这个特定用例的问题。

我有一个矩阵,它在时间步长P的大小的 3D 字段中给出一个标量值。那是,(dx,dy,dz)=(360, 720, 30)41

>>> np.shape(P)
(41, 30, 360, 720)

正如所见,z-index(我们将其称为“垂直”)是第二个维度。

我想计算这个字段的dP/dz

然而,z 中的间距在三个空间维度中的任何一个中都不均匀,并且是随时间变化的(简单地想象每个网格点都允许在每个时间步长周围浮动)。也就是说,有一个关联矩阵给出了3D 空间中每个网格点Z3的垂直坐标,其中

>>> np.shape(Z3)
(41, 30, 360, 720)

然后我如何使用np.gradient()来获得P'(t, x, y),其中P'=dP/dz

当我尝试沿轴 1 进行微分时,我得到:

>>> np.gradient(P, Z3, axis=1)
*** ValueError: distances must be either scalars or 1d

这个错误非常不透明,因为它与文档相矛盾,该文档描述了通过N维间距的能力。但是,这确实有效:

>>> np.gradient(P[0,:,0,0], Z3[0,:,0,0])

这基本上在该字段的一个“垂直列”中为我提供了dP/dz ,即在 time=0, P'(0,0,0)P的原点处的导数。考虑一下非常慢的代码:

dpdz = np.zeros(np.shape(P))

for i in range(np.shape(P)[0]):
    for j in range(np.shape(P)[2]):
        for k in range(np.shape(P)[3]):
            dpdz[i,:,j,k] = np.gradient(P[i,:,j,k], Z3[i,:,j,k])

这正是我期望np.gradient(P, Z3, axis=1)给出的结果。有没有办法使这项工作?

标签: pythonpython-3.xnumpynumerical-methodsdifferentiation

解决方案


推荐阅读