2016-08-04 36 views
0

Ich versuche, eine Reihe von Funktionen auszuführen, um einige Ergebnisse aus einer Reihe von Satellitenbildern zu erhalten (im Beispielfall führe ich Ähnlichkeitsfunktionen durch). Ich beabsichtigte zuerst, alle Pixel gleichzeitig zu durchlaufen, wobei jeder 4 Zahlen enthielt, und berechnete dann einen Wert für jeden, der auf diesen Zahlen basiert, und schrieb ihn dann in ein Array, beispielsweise scipy.spatial.distance.correlation (pixels_0, pixels_1).Iterating auf Daten in zwei 3D-Arrays Python

Das Problem, das ich habe, ist, wenn ich diese Schleife ausführen Ich habe Probleme, es zu einem Array 1000x1000 zu speichern, geben Sie einen Wert für jedes Pixel.

array_0 = # some array with dimensions(1000, 1000, 4) 
array_1 = # some array with dimensions(1000, 1000, 4) 

result_array = [] 

for rows_0, rows_1 in itertools.izip(array_0, array_1): 
    for pixels_0, pixels_1 in itertools.izip(rows_0, rows_1): 
     results = some_function(pixels_0, pixels_1) 
     print results 
     >>> # successfully prints desired results 
     results_array.append(results) 
     >>> # unsuccessful in creating the desired array 

Ich erhalte die Ergebnisse, die ich den Lauf Fenster Druck nach unten zu bekommen, aber ich weiß nicht, wie es um ihn wieder in ein Array, das ich in einem ähnlichen Herren manipulieren könnte. Sind meine for-Schleifen das Problem oder ist das ein einfaches Problem, wenn ich es an Arrays anschließe? Jede Erklärung, es zu beschleunigen, wäre auch großartig, da ich Python sehr neu bin und alles zusammen programmiert habe.

a = np.random.rand(10, 10, 4) 
b = np.random.rand(10, 10, 4) 

def dotprod(T0, T1): 
    return np.dot(T0, T1)/(np.linalg.norm(T0)*np.linalg.norm(T1)) 

results =dotprod(a.flatten(), b.flatten()) 
results = results.reshape(a.shape) 

Dies bewirkt nun, dass Valueerror: Gesamtgröße des neuen Arrays unverändert sein müssen, und wenn die ersten Ergebnisse Wert Druck erhalte ich nur eine Nummer. Ist das die Schuld an meiner eigenen schlecht konstruierten Funktion oder daran, wie ich numpy benutze?

Antwort

0

Der beste Weg, Numpy zu verwenden ist für deine Aufgabe. Sie sollten in Vektoren denken. Und Sie sollten Ihre some_function() schreiben, um vektorisiert zu arbeiten. Hier ist ein Beispiel:

array_0 = np.random.rand(1000,1000,4) 
array_1 = np.random.rand(1000,1000,4) 
results = some_function(array_0.flatten(), array_1.flatten()) ## this will be (1000*1000*4 X 1) 
results = results.reshape(array_0.shape) ## reshaping to make it the way you want it. 
+0

Ich mag die Vektorweise des Denkens, da eine der Operationen ist, den Winkel zwischen den zwei Vektoren zu finden: Ich schrieb eine einfache Funktion für sie def 'dotprod (T0, T1):' 'Rückkehr np.dot (T0, T1)/(np.linalg.norm (T0) * np.linalg.norm (T1)) 'und ersetzt die' some_function ', aber die Ausgabe ist eine einzelne Zahl und nicht in einem Array. Geht es darum, die Funktion zu wiederholen und nicht die Art, wie Sie die Zahlen im Datensatz durchgehen? – nhawkins

0

Bevor Sie mehr Aufwand in die Programmierung auf diese Weise investieren, werfen Sie einen Blick in das numpy Paket. Es wird viel schneller sein!

Über Ihren Code: sollten Ihre Ergebnisse nicht auch multidimensional sein? Also sollten Sie in Ihrer inneren (pro Zeile) Schleife an eine Zeile anhängen, die Sie dann in Ihrer äußeren Schleife an Ihre Ergebnismatrix anhängen.

Versuchen Sie es mit einer kleinen Menge von Daten (zB 10 x 10 x 4) zu lernen, aber nach dieser Umstellung auf numpy so schnell wie möglich ...

+0

Ja ich beabsichtige, eine 1000x1000 mit allen Werten zu haben, nachdem ich meine Funktionen erfüllt habe. Das hört sich vielleicht nach einer dummen Frage an, aber wenn Sie erwähnen, dass Sie zu numpy gewechselt haben, was genau meinen Sie? Ich glaube, dass meine Daten im Moment in einer Reihe liegen und wie würde ich sie strukturieren, um so gut wie möglich von numpy zu profitieren? – nhawkins