2016-05-30 6 views
0

I an einem Projekt arbeiten, wo ich habe folgende while-Schleife:Python ändert Array-Werte in While-Schleife

i = 0 
while i <= length: 
    u[:,i] = u[:,i] - u_val 
    y[:,i] = y[:,i] - y_val 
    i = i + 1 

Ziel ist u_val und y_val von ihrer jeweiligen Arrays entlang der gesamten Länge jeden Arrays zu subtrahieren, . Sowohl y und u haben eine gleiche Länge, wobei u eine Dimension von 2 und ya mit Dimension von 1.

u und y kommen aus einem Array "Daten" und definiert sind durch:

u = data[1:1+ni] 
y = data[1+ni:1+ni+no] 

u_val und y_val kommt auch von "Daten" und ist definiert durch:

u_ss = data[1:1+ni,0] 
y_ss = data[1+ni:1+ni+no,0] 

u_val = array ([0.04,550000.0]) und y_val = array ([400,153])

die erste Schleife mit den Arbeiten Werte sind subtr handelte von den ersten Werten jedes Arrays, aber dann setzt python u_val = array ([0., 0.]) und y_val = array ([0.]). Die Schleife läuft also weiter, aber Null wird jetzt von allem abgezogen. Ich habe den Variablen-Explorer angeschaut und aus irgendeinem Grund ändert die Schleife die ursprünglichen Einträge auf dem Array "Daten" ebenfalls auf Null. Warum sollte die Schleife das tun?

Ich habe mehrmals neu gestartet und ich habe es auch als for-Schleife versucht. Ich kann nicht herausfinden, was in der Schleife die Änderung im ursprünglichen Array auslöst. Danke für die Hilfe!

+0

Bitte fügen Sie einfach den vollständigen Code (ich denke, relativ kurz), so dass die Welt bereit zu helfen hat nicht z. rate mal, was "Länge" für einen Wert haben könnte und wie man dieses Snippet auf einem anderen Rechner ausprobiert ;-) – Dilettant

+2

Ich habe das Tag [tag: numpy] zu deiner Frage hinzugefügt, weil ich annehme, dass du numpy verwendest, wenn nicht dann bitte Geben Sie an, welche Art von Arrays Sie in Python verwenden –

Antwort

0

ist ein view von Daten. So ist data[1:1+ni] (was auch als data[1:1+ni, :] ausgedrückt werden kann). Wenn Sie ein Element einer Sicht ändern (wie in u[:,i] = u[:,i] - u_val), ändern Sie das entsprechende Element in data und in jeder anderen Sicht, die dieses Element enthält. Also, ohne alle Schnittbereiche zu sortieren, kann ich sehen, wo diese Berechnung den Wert (die Werte) von u_val ändern könnte.

Sie können einige Kopien machen müssen, wie

u_val = data[1:1+ni,0].copy() 

in uu_val von Änderungen zu isolieren (und data).

Das Verständnis von Kopien und Ansichten ist grundlegend für die Arbeit mit numpy.

Kann nicht

i = 0 
while i <= length: 
    u[:,i] = u[:,i] - u_val 
    y[:,i] = y[:,i] - y_val 
    i = i + 1 

Fassung:

u -= u_val[:,None] 
y -= y_val[:,None] 

ich die None hinzugefügt, um die Dimension der u_val zu erweitern, so dass es gegen 2d u ausgestrahlt. Wenn das nicht funktioniert, überprüfen Sie die Formen von u und u_val, etc.

Verwandte Themen