2017-09-17 2 views
1

Soit x, y, z des représentations matricielles, de sorte que (x [i, j], y [i, j], z [i , j]) correspond à un certain point. Au lieu d'avoir 3 variables, nous voulons avoir une seule variable (Points) où "Points [i, j] = (x [i, j], y [i, j], z [i, j]) "et "Points [i, j, 0] = x [i, j]"Numpy: façons alternatives de construire une matrice de points donnés séparément à la matrice de chaque coordonnée

Exemple:

import numpy as np 
x = np.array([[1, 1], 
       [2, 2]]) 
y = np.array([[1, 2], 
       [1, 2]]) 
z = np.array([[3, 4], 
       [5, 6]]) 
Points = np.array([[ [1, 1, 3], [1, 2, 4] ], 
        [2, 1, 5], [2, 2, 6] ]]) 

Actuellement, j'ai pensé à des solutions:

1ère solution:

from itertools import izip 
Temp_List=[] 
for xi, yi, zi in izip(x, y, z): 
    Temp_List.append([(xij, yij, zij) for xij, yij, zij in izip(xi, yi, zi)]) 
Points=np.array(Temp_List) 

Je sais que déballer un tuple pour l'emballer de nouveau n'est pas très intelligent, mais il est pour le bien de la rendre plus lisible et préparer la prochaine solution

2ème solution: # one-liner

from itertools import izip 
Points=np.array([zip(xi, yi, zi) for xi, yi, zi in izip(x,y,z)]) 

J'aime vraiment cette option. Cependant, dans cette solution, je suis préoccupé par la lisibilité. Peut-être que c'est juste moi mais je pense que ce n'est pas si évident que la compréhension de la liste génère quelque chose de similaire à Points dans l'exemple. À moins que vous ne soyez familiarisé avec la différence entre izip et zip.

Il est évident qu'une autre solution consiste à utiliser des index pour parcourir les éléments x, y et z comme dans d'autres langages (pour i dans xrange (...): pour j dans xrange (...): faire des choses .. Y a-t-il une autre façon de générer la variable Points à partir de x, y, z en utilisant une fonction numpy (ou non) qui améliore la lisibilité, la consommation de mémoire ou la performance?

+1

Il suffit d'utiliser: 'np.dstack ((x, y, z))'? – Divakar

+0

Les anciennes fonctions 'dstack',' hstack' et 'vstack' sont maintenant déconseillées en faveur de' pile'. Dans ce cas 'np.stack ([x, y, z], axis = 2)' – MaxNoe

+0

Merci les deux réponses sont exactement ce que je cherchais! Je ne suis pas encore très familier avec Numpy. J'ai aussi effectué quelques tests et pour les petites matrices, la performance est à peu près la même, mais en utilisant des matrices plus grandes, np.stack submerge les autres solutions. D'après ce que j'ai lu dans d'autres questions, il devrait également être plus efficace sur le plan de la mémoire –

Répondre

2

Vous pouvez utiliser la fonction de numpy stack:

import numpy as np 

x = np.array([ 
    [1, 1], 
    [2, 2], 
]) 

y = np.array([ 
    [1, 2], 
    [1, 2], 
]) 

z = np.array([ 
    [3, 4], 
    [5, 6], 
]) 


points = np.stack([x, y, z], axis=2) 

stack avec le mot-clé axis annule et remplace les anciens vstack, hstack et dstack fonctions, qui sont maintenant déconseillés.