การสร้างผลลัพธ์การไล่ระดับสีหลายมิติใน Python

Sep 22 2020

ใน 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 gradientcall ตรงกับผลลัพธ์ Octave ได้อย่างไร

เวอร์ชัน Numpy ของฉันคือ 1.19.0, Octave คือ 4.2.2

ฉันเห็นโพสต์นี้ถามคำถามการไล่ระดับ Matlab / Python อื่นการโทรนั้นเหมาะกับฉันซึ่งฉันเดาว่าเป็นกรณีที่มีมิติต่ำ

คำตอบ

3 obchardon Sep 22 2020 at 16:59
  • Matlab / Octave ใช้เค้าโครงหลักของคอลัมน์ตามค่าเริ่มต้น
  • Numpy ใช้เค้าโครงหลักของแถวตามค่าเริ่มต้น

ดังนั้นคุณต้องผกผันลำดับแกนของสองมิติแรก:

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