web-dev-qa-db-fra.com

Fonctions de grille de maillage en Python (meshgrid mgrid ogrid ndgrid)

Je cherche une comparaison claire des fonctions de type maillage. Malheureusement je ne le trouve pas!

Numpy http://docs.scipy.org/doc/numpy/reference/ fournit

  • mgrid

  • ogrid

  • meshgrid

Scitools http://hplgit.github.io/scitools/doc/api/html/index.html fournit

  • ndgrid

  • boxgrid

Idéalement, un tableau résumant tout cela serait parfait!

63
scls

numpy.meshgrid est modélisé d'après la commande meshgrid de Matlab. Il est utilisé pour vectoriser les fonctions de deux variables, afin que vous puissiez écrire

x = numpy.array([1, 2, 3])
y = numpy.array([10, 20, 30]) 
XX, YY = numpy.meshgrid(x, y)
ZZ = XX + YY

ZZ => array([[11, 12, 13],
             [21, 22, 23],
             [31, 32, 33]])

Donc, ZZ contient toutes les combinaisons de x et y mises dans la fonction. Quand vous y réfléchissez, meshgrid est un peu superflu pour les tableaux numpy, car ils diffusent. Cela signifie que vous pouvez faire

XX, YY = numpy.atleast_2d(x, y)
YY = YY.T # transpose to allow broadcasting
ZZ = XX + YY

et obtenir le même résultat.

mgrid et ogrid sont des classes auxiliaires qui utilisent la notation d'index pour que vous puissiez créer XX et YY directement dans les exemples précédents, sans devoir utiliser linspace. L'ordre dans lequel les sorties sont générées est inversé.

YY, XX = numpy.mgrid[10:40:10, 1:4]
ZZ = XX + YY # These are equivalent to the output of meshgrid

YY, XX = numpy.ogrid[10:40:10, 1:4]
ZZ = XX + YY # These are equivalent to the atleast_2d example

Je ne suis pas familier avec les outils scitools, mais ndgrid semble équivalent à meshgrid, alors que BoxGrid est en réalité une classe entière pour aider avec ce genre de génération.

71
chthonicdaemon

np.mgrid et np.meshgrid() font la même chose mais les premier et deuxième axes sont permutés:

# 3D
d1, d2, d3 = np.mgrid[0:10, 0:10, 0:10]
d11, d22, d33 = np.meshgrid(np.arange(10),np.arange(10),np.arange(10))
np.array_equal(d1,d11)

rendements False. Il suffit d'échanger les deux premières dimensions:

d11 = np.transpose(d11,[1,0,2])
np.array_equal(d1,d11)

rendements True

0
dopexxx