2011-02-02 25 views
7

Tengo dos matrices numpy 2D como esta, que representan las distancias x/y entre tres puntos. Necesito las distancias x/y como tuplas en una sola matriz.Unir dos matrices numpy 2D en una única matriz 2D de 2 tuplas

Así que a partir de:

x_dists = array([[ 0, -1, -2], 
       [ 1, 0, -1], 
       [ 2, 1, 0]]) 

y_dists = array([[ 0, -1, -2], 
       [ 1, 0, -1], 
       [ 2, 1, 0]]) 

necesito:

dists = array([[[ 0, 0], [-1, -1], [-2, -2]], 
       [[ 1, 1], [ 0, 0], [-1, -1]], 
       [[ 2, 2], [ 1, 1], [ 0, 0]]]) 

He intentado usar varias permutaciones de dstack/hstack/vstack/concatenar, pero ninguno de ellos parecen hacer lo que quiera . Las matrices reales en el código son susceptibles de ser gigantescas, por lo que iterar sobre los elementos en python y hacer la reordenación "manualmente" no es una opción a la velocidad.

Editar: Esto es lo que me ocurrió en el final: https://gist.github.com/807656

+1

IS es sólo una coincidencia que '' x_dist' y y_dist' son los mismos? ¿Cuál es el significado de la distancia negativa en su aplicación? ¿'_dist' sería siempre 'simétrico', pero la parte uppertridiagonal sería simplemente negativa? ¿Cuántos puntos espera manejar? ¿Cuál es el propósito de este apilamiento de matrices? ¿Los elementos estarían en orden "óptimo" para más cálculos? Sólo algunos duros, gracias – eat

+0

Es una coincidencia. Los puntos de ejemplo son (0, 0), (1, 1), (2, 2) por motivos de cordura. _dist es de hecho simétrico. El objetivo de apilar las matrices es que puedo usarlas para mover los puntos. Ver la esencia vinculada – Zarkonnen

Respuesta

10
import numpy as np 
dists = np.vstack(([x_dists.T], [y_dists.T])).T 

vuelve dists como los necesitabas. Después, no es "una única matriz 2D de 2 tuplas", sino una matriz 3D normal donde el tercer eje es la concatenación de las dos matrices originales.

que aparezca:

dists.shape # (3, 3, 2) 
+1

Eso es lo que realmente quería. Me temo que mi uso del término "matriz 2D de 2-tuplas" fue bastante engañoso. :( – Zarkonnen

+0

Pero su ejemplo de 'dists' esperado fue claro :) – eumiro

7
numpy.rec.fromarrays([x_dists, y_dists], names='x,y') 
+0

Brillante! Eso es exactamente lo que quería. Entonces, um, viendo lo que parece saber sobre numpy, ¿la función que edité de una manera sensata de calcular estas distancias pairwise? – Zarkonnen

+0

Editar: En realidad, esto no me da una matriz que sé cómo hacer algo con. – Zarkonnen

Cuestiones relacionadas