如何在多维数据上使用 np.gradient?

问题描述

对此存在很多问题,但我找不到描述此特定用例的问题。

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

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

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

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

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

>>> np.shape(Z3)
(41,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],Z3[0,0])

这基本上给了我 dP/dz 在该字段的一个“垂直列”中,即 P 在时间 = 0 处的原点的导数,P'( 0,0)。考虑慢得可怕的代码

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,k],Z3[i,k])

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...