[gelöst] Bug in NumPy bzw. MatPlotLib????

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hiwwelchen
User
Beiträge: 4
Registriert: Freitag 26. Mai 2006, 12:33

Hi,

habe vor kurzem als Alternative zu Matlab NumPy und Co. entdeckt.

Nach einiger Zeit bin ich nun auf ein, wie ich finde, recht interessantes Phänomen gestoßen welches ich mir nicht erklären kann und vor allem nicht weiß ob es gewollt ist, oder es sich um ein Fehler handelt. Vielleicht kann mir ja hier einer weiterhelfen. Das "Problem":

Aus einer Datei lese ich Tiefeninformationen und Intensitätswerte einer Umgebung aus. Beim Auslesen speichere ich die Infos in ein eindim. Array zwischen:

Code: Alles auswählen

im = NP.array(NP.zeros( (cols*rows) ))
for x in range(rows):
	data = line[x].split('|')
	for xx in range(cols):
		pos = data[xx].split(';')
		im[x*cols+xx] = float(pos[2])
depthImage = im.reshape(rows,cols)

im = NP.array(NP.zeros( (cols*rows) ))
for x in range(rows, rows*2):
	data = line[x].split('|')
	for xx in range(cols):
		im[(x-rows)*cols+xx] = int(float(data[xx]))
intImage = im.reshape(rows,cols)

figure()
axis("off")
title("Depth")
depth = imshow(depthImage, interpolation='bilinear', origin='upper', extent=(0,cols,0,rows))
clim(0.0,7.5)
Resultat:
Bild

Kommentiere ich nun die Zeile Nr. 10 aus, erhalte ich folgendes Bild:
Bild

Ist das ein Fehler von NumPy, MatPlotLib, ....?
Oder ist das gewollt und ich habe es nur nicht verstanden? Kann mir dann einer das erklären.

Grüße,
Hiwwelchen

P.S.: Hoffe hier bin ich richtig, da ich kein besseres Forum zuordnen konnte[/img]
Zuletzt geändert von hiwwelchen am Montag 3. März 2008, 18:00, insgesamt 1-mal geändert.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Das hat mit NumPy nichts zu tun. In Zeile 10 weist du "im" einem neuen Array zu, wenn du das nicht machst, überschreibst du in der zweiten Schleife dein depthImage, da dann depthImage und im das gleiche Array darstellen.

Edit: Ich habe mir das nochmal angeschaut. Anscheinend gibt reshape wirklich ein neues Array zurück, allerdings greift dieses neue Array trotzdem noch auf auf das Alte zurück.

Also z.B. bei rows=cols=100: im[350] == depthImage[3][50]
Zuletzt geändert von Darii am Sonntag 2. März 2008, 13:03, insgesamt 3-mal geändert.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

.reshape führt keine Kopie durch. Wenn Du also nicht mit Zeile 10 ein neues Array erzeugst, verändert Zeile 14 auch den Inhalt von depthImage. (http://projects.scipy.org/pipermail/num ... 27366.html)
MfG
HWK
hiwwelchen
User
Beiträge: 4
Registriert: Freitag 26. Mai 2006, 12:33

Oha,

sowas in der Art hatte ich mir schon fast gedacht, nur konnte ich es mir nicht ganz erklären.

Danke für die schnelle Hilfe.

Wenn ich das nun richtig verstanden habe, wird von reshape nur eine Referenz auf das Objekt übergeben. Danach erstelle ich ein neues Objekt, das alte bleibt aber im Speicher, so dass daurch das Ganze dann funktionniert. Sehr interessant.

Grüße,
Guy
Antworten