问题描述
对此存在很多问题,但我找不到描述此特定用例的问题。
我有一个矩阵 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 (将#修改为@)