Numpy matrice de coordonnées

Je vais essayer d'obtenir une matrice de coordonner les-tableaux. Ceci est différent de numpy.meshgrid. Par exemple, pour une 2x2 taille que je veux le 2x2x2 sortie

[[[0,0],[0,1]],
 [[1,0],[1,1]]]

comme un tableau numpy. C'est probablement ce qui ressemble et se lit plus propre d'une matrice 2x2 de tuples:

[[(0,0),(0,1)],
 [(1,0),(1,1)]]

(sauf que je ne pense pas que vous pouvez avoir des tuples dans un tableau numpy, et ce n'est pas le point ici)

Cet exemple simple peut être fait par la commutation des axes de numpy-meshgrid de sortie (plus précisément, le déplacement du premier axe sera le dernier):

np.array(np.meshgrid([0,1],[0,1])).transpose([1,2,0])

Cela pourrait facilement être généralisé à l'arbitraire dimensions, sauf que meshgrid ne se comporte pas comme je m'attends depuis plus de 2 entrées. Plus précisément, les matrices ont des valeurs de coordonnées qui varient le long des axes dans une étrange commande:

In [627]: np.meshgrid([0,1],[0,1],[0,1])
Out[627]:
[array([[[0, 0],
        [1, 1]],

       [[0, 0],
        [1, 1]]]),
 array([[[0, 0],
        [0, 0]],

       [[1, 1],
        [1, 1]]]),
 array([[[0, 1],
        [0, 1]],

       [[0, 1],
        [0, 1]]])]

Avis que les éléments de cette production varient le long des axes 1, 0 et 2, respectivement. Cela va créer une mauvaise coordonner la matrice; j'aurais besoin de la sortie de varier le long des axes 0, 1, et 2, dans cet ordre. Si je pouvais faire

In [642]: np.array(np.meshgrid([0,1],[0,1],[0,1])).swapaxes(1,2)
Out[642]:
array([[[[0, 0],
         [0, 0]],

        [[1, 1],
         [1, 1]]],


       [[[0, 0],
         [1, 1]],

        [[0, 0],
         [1, 1]]],


       [[[0, 1],
         [0, 1]],

        [[0, 1],
         [0, 1]]]])

Mais cela commence à devenir vraiment hacky et je ne sais pas si je peux compter sur le bon de commande en plus de la dimension meshgrid sorties. numpy.mgrid donne le bon ordre, mais ne semble pas permettre à des valeurs arbitraires, dont j'aurais besoin. Donc, cela se résume à deux questions:

1) Est-il une façon plus propre, peut-être que certaines fonctions de numpy, je suis absent, qui va générer une matrice des coordonnées des vecteurs comme décrit?
2) Est-ce bizarre de commande vraiment ce que nous attendons de meshgrid? Est-il un spec à ce point que je peux compter sur?

[MODIFIER] la Suite sur Jaime solution, voici un plus généralisée de la fonction de construire un peu plus explicitement, pour toute personne intéressée: [EDIT 2, correction d'un bug, peut-être une autre, ne peuvent consacrer beaucoup plus de temps sur ce droit maintenant, ce doit vraiment être un plus commun de la fonction...]

def build_coords(*vecs):
    coords = numpy.empty(map(len,vecs)+[len(vecs)])
    for ii in xrange(len(vecs)):
        s = np.hstack((len(vecs[ii]), np.ones(len(vecs)-ii-1)))
        v = vecs[ii].reshape(s)
        coords[...,ii] = v
    return coords
ce que j'aime à faire est de garder les deux tableaux: un pour les x-coords et l'autre pour l'axe des coordonnées. Ensuite, vous pouvez simplement créer les paires de coordonnées par l'accès aux éléments à la fois à partir de deux tableaux avec les mêmes indices. Vous ne savez pas si cela fonctionnera pour vous, mais c'est mon point de vue sur ces situations.
J'aime faire pauls méthode ... mais pour les points je zip x et y ensemble
J'ai réellement besoin de l'ensemble de la matrice dans ce cas, l'objectif est d'évaluer un multivariée de la fonction à une grille de coordonnées. Peut-être que la solution serait de réécrire la fonction d'accepter un tuple (x, y, z, ...) les valeurs au lieu d'une matrice des coordonnées des vecteurs, mais ensuite j'ai toujours le problème de génération de ces dans le bon sens, qui meshgrid semble ne pas le faire pour une raison quelconque. J'ai vraiment l'impression que c'est un bug dans meshgrid, n'est-il pas?

OriginalL'auteur Andrew Schwartz | 2014-06-26