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