python - 如何在多维数据上使用 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)
给出的结果。有没有办法使这项工作?
解决方案
推荐阅读
- spacy - Spacy v3 - 找不到标签和依赖项列表
- flutter - 在我的堆叠图像文件 (Flutter) 之后我有多余的空间
- java - 为什么 JavaFX 在 Homebrew 的 OpenJDK 17 下不起作用?
- c - 在 C 中将时间转换为字符串并添加到 Txt
- bash - 比较值的简单 bash 程序
- c# - 我正在尝试从另一个对象列表分配和输出到控制台字符串列表。但它继续重复字符串
- ruby-on-rails - Rails 5 + ActiveAdmin - safari 发出 mime 类型的意外附加请求 */*
- flutter - 如何将购物车中的商品设置为0
- css - 在产品上构建时如何撤消选择器的分组?
- python - 尝试在 Pandas Dataframe 上创建 % 列,但仅获取 NaN 值