2013-06-22 10 views
3

J'essaie de créer un tableau numérique de coordonnées. Jusqu'à présent, j'ai juste utilisé x_coords, y_coords = numpy.indices((shape)). Maintenant, cependant, je veux combiner x_coords et y_coords dans un tableau, tel que x_coords = thisArray[:,:,0] et y_coords = thisArray[:,:,1] Dans ce cas, thisArray est un tableau à deux dimensions. Existe-t-il un moyen simple ou pythonique de le faire?Manière pythonienne de créer un tableau numérique de coordonnées

Je pensais à l'origine à l'aide numpy.outer, mais cela ne me donne pas tout à fait ce dont j'ai besoin. Une idée possible consiste simplement à utiliser la concaténation du tableau d'indices le long de l'axe (2ème?), Mais cela ne semble pas être une solution très élégante. (c'est peut-être le plus propre ici).

Merci!

Répondre

2

Ce qui renvoie np.indices est déjà un tableau, mais x_coords = thisArray[0, :, :] et y_coords = thisArray[1, :, :]. Sauf si vous avez des exigences très strictes pour votre tableau de coordonnées (à savoir que ce soit contigu) vous pouvez prendre une vue de ce tableau avec le premier axe rolled à la fin:

thisArray = numpy.rollaxis(numpy.indices(shape), 0, len(shape)+1) 
+0

Hm, qui semble fonctionner - que voulez-vous dire par la condition qu'il soit contigu? (Parlez-vous de son emplacement en mémoire?) – James

+1

Lorsque vous faites rouler l'axe, la disposition de la mémoire des données n'est pas modifiée, seules les foulées du tableau. En mémoire, toutes les coordonnées x seront ensemble au début de la section mémoire, suivies de toutes les coordonnées y. Si vous avez créé votre tableau directement avec la forme que vous recherchez, les coordonnées x et y seraient alternées en mémoire. Pour certaines choses de fantaisie, la disposition de la mémoire réelle peut ralentir certains calculs, ou nécessiter une copie de la matrice, qui est lente. Par exemple, vous ne pouvez pas envoyer un tableau non contigu à 'np.frombuffer'. Mais pour la plupart des applications, ce n'est pas un problème du tout. – Jaime

+0

Hm ok, merci. Une autre question alors. Supposons que je voulais aplatir le 2ème et le 3ème axe. (Parce que je ne m'inquiète pas vraiment de l'ordre dans lequel ils sont. Je veux juste juste un tableau de vecteurs). Comment pourrais-je faire ça? – James

Questions connexes