Tái tạo kết quả Gradient đa chiều bằng Python

Sep 22 2020

Trong Octave, tôi có

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)

đầu ra nào

1.18882   1.92355   1.92355   1.18882   0.00000  -1.18882  -1.92355  -1.92355  -1.18882  -0.00000

Với Python, tôi đã cố gắng tái tạo nó,

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])

tôi có

[-1.18882065 -0.59441032  0.59441032  1.55618643  1.92355221  1.55618643
  0.59441032 -0.59441032 -1.55618643 -1.92355221]

trông khác. Làm cách nào để gradientcuộc gọi Numpy khớp với kết quả Octave?

Phiên bản Numpy của tôi là 1.19.0, Octave là 4.2.2.

Tôi thấy bài đăng này hỏi một câu hỏi khác về độ dốc của Matlab / Python, lệnh gọi đó phù hợp với tôi, mà tôi đoán là trường hợp chiều thấp.

Trả lời

3 obchardon Sep 22 2020 at 16:59
  • Matlab / Octave sử dụng bố cục chính cột theo mặc định
  • Numpy sử dụng bố cục chính hàng theo mặc định

Vì vậy, bạn cần phải đảo ngược thứ tự trục của hai kích thước đầu tiên:

a,b,c = np.gradient (u, dx, dy, dz, axis=[1,0,2])