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
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
Vous devez vous connecter pour publier un commentaire.
Essayer
np.meshgrid([0, 1], [0, 1], [0, 1], indexing="ij")
. Lemeshgrid
docs sont en fait assez explicite sur la façon dont le défautindexing="xy"
produit un drôle d'axe de la commande par rapport à la non-par défautindexing="ij"
, de sorte que vous pouvez vérifier pour plus de détails. (Ils ne sont pas aussi claires sur pourquoi cela fonctionne de cette façon, hélas...)OriginalL'auteur Nathaniel J. Smith
Compte tenu de la 1D coords:
J'espérais que ce serait faire l'affaire:
Mais apparemment
dstack
et comme le besoin correspondant exactement les dimensions, ils ne seront pas diffuser de, ce qui je pense est une honte.Si cette alternative est un peu long, mais explicite est mieux qu'implicite, et vous pouvez toujours enrouler le tout dans un peu de fonction:
OriginalL'auteur Jaime
La fonction numpy
indices
peut également être utilisé à cet effet, ses fonctionnalités clair de son nom.qui peut être considéré comme un 2 de 3 de la matrice des coordonnées y et 2 par 3 la matrice de coordonnées x (
y,x = np.indices((2,3))
). Il peut être refondue dans la forme proposée par Jaime en transposant les axes:Il est fonctionnellement équivalent à le
meshgrid
solution, à l'aide deindexing='ij'
, mais ne vous oblige pas à fournir les coordonnées des tableaux, ce qui peut être un avantage quand vous avez beaucoup de dimensions.Calendrier sage, ces solutions sont similaires, lorsque vous prenez en compte le temps nécessaire pour générer les tableaux 1d sur lequel
meshgrid
fonctionne, maismeshgrid
retourne une liste (des tableaux), pas un ad-tableau commeindices
. En ajoutant un appel supplémentaire ànp.array
comme le fait lef1
ci-dessus,indices
a un avantage clair surmeshgrid
:Sans appel supplémentaire à
array
:Toujours être prudent avec l'interprétation de timings. Ce ne sera probablement pas le goulot d'étranglement dans tout problème que vous abordez.
Dans tous les cas,
meshgrid
pouvez faire beaucoup plus de choses queindices
peut, comme la production d'un plus générale rectiligne de la grille au lieu d'une grille Cartésienne, afin de les utiliser le cas échéant. Dans ce cas, j'irais avec le nom sage plus descriptifindices
.np.indices
fonctionne et a été faite avec exactement cet objectif à l'esprit.OriginalL'auteur Oliver W.
La manière la plus simple que j'utilise est la suivante-
La
pos
est requis coordonnées de tableau.OriginalL'auteur Injitea