2011-02-02 11 views
7

Mam dwie taktyczne liczby 2D, reprezentujące odległości x/y pomiędzy trzema punktami. Potrzebuję odległości x/y jako krotek w jednej tablicy.Łączenie dwóch tablic 2D numpy w pojedynczą tablicę 2D z 2-krotkami

Więc od:

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

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

muszę:

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

Próbowałem przy użyciu różnych permutacji dstack/hstack/vstack/concatenate, ale żaden z nich nie wydają się zrobić to, co chcę . Rzeczywiste tablice w kodzie mogą być gigantyczne, więc iteracja nad elementami w pythonie i wykonanie "ręcznego" przegrupowania nie jest opcją na szybkość.

Edit: To co wymyśliłem w końcu: https://gist.github.com/807656

+1

Czy to tylko przypadek, że '' y_dist' x_dist' i są takie same? Jakie jest znaczenie ujemnej odległości w Twojej aplikacji? Czy '_dist' zawsze będzie" symetryczny ", ale część górno-ośmiokątna będzie po prostu ujemna? Ile punktów spodziewasz się obsłużyć? Jaki jest cel tego układania tablic? Czy elementy byłyby w "optymalnej" kolejności do dalszych obliczeń? Po prostu kilka drobiazgów, dzięki – eat

+0

To zbieg okoliczności. Przykładowymi punktami są (0, 0), (1, 1), (2, 2) dla zachowania zdrowia psychicznego. _dist jest rzeczywiście symetryczny. Celem układania tablic jest to, że mogę ich używać do przesuwania punktów. Zobacz powiązane informacje ogólne. – Zarkonnen

Odpowiedz

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

powraca dists jakby je chciał. Później nie jest to "pojedyncza tablica 2D z 2 krotkami", ale normalna tablica 3D, gdzie trzecia oś jest połączeniem dwóch oryginalnych tablic.

Zobaczysz:

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

Naprawdę tego chciałem. Obawiam się, że moje użycie terminu "tablica 2D z 2-krotkami" było raczej mylące. :( – Zarkonnen

+0

Ale twój przykład wyczekiwanego 'dists' był jasny :) – eumiro

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

Genialny! Dokładnie tego chciałem. A więc, widząc, jak wydaje się, że wiesz o numpy, czy funkcja, którą redagowałem w rozsądny sposób obliczania tych odległości parami? – Zarkonnen

+0

Edycja: Właściwie to nie daje mi tablicy, z której wiem, jak robić cokolwiek. – Zarkonnen

Powiązane problemy