【问题标题】:Numpy gradient for a 2 dimensions array二维数组的 Numpy 梯度
【发布时间】:2021-11-03 09:06:11
【问题描述】:

我不确定如何使用 numpy.gradient()。

计算我使用 for 循环的偏导数(二阶):

for j in range(1, nx-1): 
            d2px[:, j] = (p[:, j - 1] - 2 * p[:, j] + p[:, j + 1]) / dx ** 2
for i in range(1, ny-1): 
            d2py[i, :] = (p[i - 1, :] - 2 * p[i, :] + p[i + 1, :]) / dy ** 2 

我尝试用 numpy.gradient 替换它:(此处为 x)

dpx = np.gradient(p, [1, dx], axis = 0)
d2px = np.gradient(dpx, [1, dx])

但我总是有同样的错误信息:

"ValueError: 1d时,距离必须与对应维度的长度相匹配"

使用以下代码:

x = np.linspace(0, nx, nx) # coordonnées selon x...
dpx = np.gradient(p, x, axis = 0)
d2px_test = np.gradient(dpx, x, axis = 0)

输入 p 是:

[[ 0.00000000e+00  0.00000000e+00  0.00000000e+00  0.00000000e+00
   0.00000000e+00]
 [ 0.00000000e+00  6.53832270e-23 -1.19328961e-22  6.53832270e-23
   0.00000000e+00]
 [ 0.00000000e+00 -1.19328961e-22  2.07190726e-22 -1.19328961e-22
   0.00000000e+00]
 [ 0.00000000e+00  6.53832270e-23 -1.19328961e-22  6.53832270e-23
   0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00  0.00000000e+00
   0.00000000e+00]]

预期的输出是:

[[ 0.00000000e+00  0.00000000e+00  0.00000000e+00  0.00000000e+00
   0.00000000e+00]
 [ 0.00000000e+00 -2.50095415e-20  3.69424377e-20 -2.50095415e-20
   0.00000000e+00]
 [ 0.00000000e+00  4.45848648e-20 -6.53039374e-20  4.45848648e-20
   0.00000000e+00]
 [ 0.00000000e+00 -2.50095415e-20  3.69424377e-20 -2.50095415e-20
   0.00000000e+00]
 [ 0.00000000e+00  0.00000000e+00  0.00000000e+00  0.00000000e+00
   0.00000000e+00]]

而实际的输出是:

[[ 0.00000000e+00 -8.00305329e-23  1.42671568e-22 -8.00305329e-23
   0.00000000e+00]
 [ 0.00000000e+00 -2.09226327e-23  3.81852676e-23 -2.09226327e-23
   0.00000000e+00]
 [ 0.00000000e+00  3.81852676e-23 -6.63010323e-23  3.81852676e-23
   0.00000000e+00]
 [ 0.00000000e+00 -2.09226327e-23  3.81852676e-23 -2.09226327e-23
   0.00000000e+00]
 [ 0.00000000e+00 -8.00305329e-23  1.42671568e-22 -8.00305329e-23
   0.00000000e+00]]

在可视化方面: 预期的输出是:

实际输出(使用 np.gradient)是:

感谢您的帮助。

【问题讨论】:

  • 请将您的答案作为单独的答案放在下面。
  • 不幸的是,这不是一个答案,因为我得到的结果不是我所期望的。
  • 然后删除编辑块。能否请您提供输入数据和预期输出数据?
  • 输入数据是一个 500x500 的压力场,我想计算与 x 和 y 相关的偏导数,以便计算所有点的下一个压力(使用波动方程)。但问题是我得到的是 1D 波而不是之前的 2D 波。
  • 好的,但请提供示例输入数据和预期输出数据。一个大约 5x5 的小例子。

标签: python numpy gradient


【解决方案1】:

你可以简单地将操作向量化

d2px2 = (p[:, :-2] - 2 * p[:, 1:-1] + p[:, 2:]) / dx ** 2
d2py2 = (p[:-2, :] - 2 * p[1:-1, :] + p[2:, :]) / dy ** 2

np.allclose(d2px2, d2px[:, 1:])
# True
np.allclose(d2py2, d2py[1:, :])
# True

【讨论】:

  • 是的,谢谢,我仍然不知道渐变出了什么问题,但这是可行的,并且有望使代码更高效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 2021-01-19
  • 2011-03-04
  • 2022-12-15
  • 2020-07-30
相关资源
最近更新 更多