Reproducir resultados de degradado multidimensional en Python

Sep 22 2020

En Octave, tengo

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)

que salidas

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

Con Python, intenté replicarlo,

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

yo obtengo

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

que se ve diferente. ¿Cómo hago para que la gradientllamada de Numpy coincida con los resultados de Octave?

Mi versión de Numpy es 1.19.0, Octave es 4.2.2.

Vi esta publicación haciendo otra pregunta de gradiente de Matlab / Python, esa llamada funciona para mí, que supongo que es el caso de baja dimensión.

Respuestas

3 obchardon Sep 22 2020 at 16:59
  • Matlab / Octave usa el diseño principal de la columna de forma predeterminada
  • Numpy usa el diseño principal de la fila de forma predeterminada

Entonces necesitas invertir el orden de los ejes de las dos primeras dimensiones:

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