Probleme mit numpy.array

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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Kann mir jemand erklären, wie folgendes Verhalten zustande kommen kann?

Code: Alles auswählen

import Image, numpy
def load_16bit_tiff(filename):
    image = Image.open(filename)
    return numpy.array(image.getdata(), numpy.uint16).reshape(*reversed(image.size))
array = load_16bit_tiff("datei1") - load_16bit_tiff("datei2")
print array.min() # 0
array += 1 # addiere 1 zu allem, array = array + 1 hat dasselbe Ergebnis
print array.min() # 0 <-- Warum das? Solle 1 sein.
array[array == 0] = - 23 # Hab einfach mal ein bisschen rumgespielt
print array.min() # 1 <-- wtf??? Warum in aller Welt ist das *jetzt* 1 und nicht 23?
Ich bin da echt mit meinem Latein am Ende. Würde die vorletzte Zeile kein Ergebnis bringen hätte ich auf irgendwelche readonly-Buffer getippt, aber so…
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

schreib mal statt

Code: Alles auswählen

array[array == 0] = - 23 # Hab einfach mal ein bisschen rumgespielt

Code: Alles auswählen

array[0] = -23
dann gibt ein print des arrays -23

Code: Alles auswählen

>>> import numpy
>>> a = numpy.array([2,3,4])
>>> a.min()
2
>>> a += 1
>>> a.min()
3
>>> a[0] = -23
>>> a.min()
-23
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Jetzt kommst du von alleine drauf ;-)

Code: Alles auswählen

>>> x = numpy.array((1,2,3), numpy.uint16)
>>> y = numpy.array((2,2,2), numpy.uint16)
>>> z = x - y
>>> z
array([65535,     0,     1], dtype=uint16)
>>> z.min()
0
>>> z += 1
>>> z
array([0, 1, 2], dtype=uint16)
>>> z.min()
0
>>> z[z==0] = -23
>>> z
array([65513,     1,     2], dtype=uint16)
>>> z.min()
1
Das Leben ist wie ein Tennisball.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Verdammt, danke. Die Idee hatte ich auch kurzzeitig, aber irgendwie wieder verworfen weil mir 65k zu wenig erschien. Aber sind ja nur 16bit…

Manchmal sieht man den Wald vor lauter Bäumen nicht mehr…argh ich könnt mich haun.

PS: Ich aber auch sehr toll das er still und leise Integer-Overflows übergeht...
Antworten