Seite 1 von 1

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

Verfasst: Sonntag 2. März 2008, 12:12
von hiwwelchen
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]

Verfasst: Sonntag 2. März 2008, 12:51
von Darii
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]

Verfasst: Sonntag 2. März 2008, 12:53
von HWK
.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

Verfasst: Sonntag 2. März 2008, 14:17
von hiwwelchen
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