Seite 1 von 1

Probleme mit numpy.array

Verfasst: Donnerstag 27. Mai 2010, 18:59
von Darii
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…

Re: Probleme mit numpy.array

Verfasst: Donnerstag 27. Mai 2010, 19:10
von DaMutz
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

Re: Probleme mit numpy.array

Verfasst: Donnerstag 27. Mai 2010, 19:11
von EyDu
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

Re: Probleme mit numpy.array

Verfasst: Donnerstag 27. Mai 2010, 19:22
von Darii
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...