2017-09-17 3 views
1

Sei x, y, z Matrixdarstellungen, so dass (x [i, j], y [i, j], z [i , j]) entspricht einem bestimmten Punkt.Numpy: Alternative Wege, um eine Matrix von Punkten zu konstruieren, gegeben die Matrix jeder Koordinate separat

Anstatt 3 Variablen haben wir nur eine Variable (Punkte) wo "Punkte [i, j] = (x [i, j], y [i, j], z [i, j]) "und "Punkte [i, j, 0] = x [i, j]"

Beispiel:

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] ]]) 

Zur Zeit habe ich von einigen Lösungen gedacht:

1. Lösung:

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) 

Ich weiß, dass ein Tupel Auspacken es wieder zu packen nicht sehr klug ist, aber es ist aus Gründen es besser lesbar und bereitet die nächste Lösung

zweite Lösung machen: # Einzeiler

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

Ich mag diese Option wirklich. Bei dieser Lösung bin ich jedoch um die Lesbarkeit besorgt. Vielleicht ist es nur ich, aber ich fühle, dass es nicht so offensichtlich ist, dass das Listenverständnis etwas erzeugt, das den Punkten im Beispiel ähnlich ist. Es sei denn, Sie sind mit dem Unterschied zwischen izip und zip vertraut.

Es ist offensichtlich, dass eine andere Lösung die Verwendung von Indizes ist, um über die Elemente x, y und z wie in anderen Sprachen zu iterieren (für i in xrange (...): für j in xrange (...): do stuff .. .)

Abschließend: Gibt es eine andere Möglichkeit, die Points-Variable aus x, y, z mit Hilfe einer Num- py-Funktion (oder nicht) zu generieren, die entweder Lesbarkeit, Speicherverbrauch oder Leistung verbessert?

+1

Verwenden Sie einfach: 'np.dstack ((x, y, z))'? – Divakar

+0

Die alten Funktionen 'dstack',' hstack' und 'vstack' sind nun zugunsten von' stack' veraltet. In diesem Fall 'np.stack ([x, y, z], Achse = 2)' – MaxNoe

+0

Danke beide Antworten sind genau das, was ich gesucht habe! Ich kenne mich noch nicht sehr gut aus. Auch habe ich ein paar Tests durchgeführt und für kleine Matrizen ist die Leistung ungefähr gleich, aber wenn größere Matrizen verwendet werden, überfordert np.stack die anderen Lösungen. Nach dem, was ich in anderen Fragen gelesen habe, sollte es auch speichereffizienter sein –

Antwort

2

können Sie numpy die Verwendung stack Funktion:

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 mit dem axis Schlüsselwort ersetzt die alten vstack, hstack und dstack Funktionen, die jetzt veraltet sind.

Verwandte Themen