在 Python 中重现多维梯度结果
Reproducing Multidimensional Gradient Results in Python
在Octave中,我有
x = -0.8:0.2:1;
y = -0.8:0.2:1;
z = -0.8:0.8:1;
[xx,yy,zz] = meshgrid(x, y, z);
u = sin(pi .* xx) .* cos(pi .* yy) .* cos(pi .* zz);
dx = xx(1,:,1)(:);
dy = yy(:,1,1)(:);
dz = zz(1,1,:)(:);
[a, b, c] = gradient (u, dx, dy, dz);
b(1,:,1)
输出
1.18882 1.92355 1.92355 1.18882 0.00000 -1.18882 -1.92355 -1.92355 -1.18882 -0.00000
用Python,我试着复制它,
import numpy as np
xx, yy, zz = np.meshgrid(np.arange(-0.8, 1.2, 0.2),
np.arange(-0.8, 1.2, 0.2),
np.arange(-0.8, 1.2, 0.8))
u = np.sin(np.pi * xx) * np.cos(np.pi * yy) * np.cos(np.pi * zz)
dx = xx[0,:,0]
dy = yy[:,0,0]
dz = zz[0,0,:]
a,b,c = np.gradient (u, dx, dy, dz)
print (b[0,:,0])
我明白了
[-1.18882065 -0.59441032 0.59441032 1.55618643 1.92355221 1.55618643
0.59441032 -0.59441032 -1.55618643 -1.92355221]
看起来不一样。如何让 Numpy gradient
调用与 Octave 结果相匹配?
我的Numpy版本是1.19.0,Octave是4.2.2。
我看到 问另一个 Matlab / Python 梯度问题,那个调用对我有用,我猜这是低维情况。
- Matlab/Octave 默认使用分栏主布局
- Numpy 默认使用行主布局
因此需要将前两个维度的坐标轴顺序倒过来:
a,b,c = np.gradient (u, dx, dy, dz, axis=[1,0,2])
在Octave中,我有
x = -0.8:0.2:1;
y = -0.8:0.2:1;
z = -0.8:0.8:1;
[xx,yy,zz] = meshgrid(x, y, z);
u = sin(pi .* xx) .* cos(pi .* yy) .* cos(pi .* zz);
dx = xx(1,:,1)(:);
dy = yy(:,1,1)(:);
dz = zz(1,1,:)(:);
[a, b, c] = gradient (u, dx, dy, dz);
b(1,:,1)
输出
1.18882 1.92355 1.92355 1.18882 0.00000 -1.18882 -1.92355 -1.92355 -1.18882 -0.00000
用Python,我试着复制它,
import numpy as np
xx, yy, zz = np.meshgrid(np.arange(-0.8, 1.2, 0.2),
np.arange(-0.8, 1.2, 0.2),
np.arange(-0.8, 1.2, 0.8))
u = np.sin(np.pi * xx) * np.cos(np.pi * yy) * np.cos(np.pi * zz)
dx = xx[0,:,0]
dy = yy[:,0,0]
dz = zz[0,0,:]
a,b,c = np.gradient (u, dx, dy, dz)
print (b[0,:,0])
我明白了
[-1.18882065 -0.59441032 0.59441032 1.55618643 1.92355221 1.55618643
0.59441032 -0.59441032 -1.55618643 -1.92355221]
看起来不一样。如何让 Numpy gradient
调用与 Octave 结果相匹配?
我的Numpy版本是1.19.0,Octave是4.2.2。
我看到
- Matlab/Octave 默认使用分栏主布局
- Numpy 默认使用行主布局
因此需要将前两个维度的坐标轴顺序倒过来:
a,b,c = np.gradient (u, dx, dy, dz, axis=[1,0,2])