array werte ändern

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
flip1982
User
Beiträge: 18
Registriert: Montag 4. April 2016, 15:36

Hallo,
muss ein ursprüngliches tiff verändern. sinn ist es eine 0 und 1 maske aus einer bildaufnahme zu erstellen. habs so probiert:

Code: Alles auswählen

for e in np.nditer([im], [], ['readwrite']):    
    if e > 23552:
        e = 0
        print e
    else:
        e = 1
        print e 
print im 
leider ist das im- array nach der for-schleife unverändert....

wie kann ich das im-array dauerhaft ändern oder ein neues array mit den gewünschten werten erstellen??
würde mich freuen wenn mir jemand helfen kann
vielen dank schonmal
Zuletzt geändert von Anonymous am Montag 4. April 2016, 16:00, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
BlackJack

@flip1982: Wenn Du eine Schleife in Python-Code schreibst, dann machst Du in den allermeisten Fällen schon etwas falsch, denn Numpy-Arrays verwendet man ja gerade weil man diese Schleifen vermeiden möchte. Du suchst wahrscheinlich ganz einfach nur: ``mask = im > 23552``. Das erstellt ein Array mit Wahrheitswerten wo überall `True` steht wenn der Wert grösser 23552 ist und überall `False` wo der Wert kleiner oder gleich 23552 ist.
flip1982
User
Beiträge: 18
Registriert: Montag 4. April 2016, 15:36

@BlackJack:
das habe ich leider nicht hingekriegt mit true und false... und ich wollte eigentlich schon ein array das dann die werte je nach fall mit null und ein ersetzt, da sich so ganz einfach mehrere layer von tiff-arrays miteinander verrechnen lassen... vll weis jemand wie ich ich das machen kann??
BlackJack

@flip1982: Da gibt's eigentlich nichts hinzukriegen, das geht so wie ich das gezeigt habe. Und ob nun 0 und 1 oder `False` und `True` sollte egal sein. Was willst Du denn mit 0 und 1 verrechnen was mit logischen Bitoperationen nicht geht? Ansonsten kannst Du ein Array mit Elementen vom Tyo `bool` auch einfach in eines mit ganzen Zahlen umwandeln.
flip1982
User
Beiträge: 18
Registriert: Montag 4. April 2016, 15:36

@ BlackJack: habs hingekriegt wie von dir beschrieben. hab jetzt den 0 und 1 layer :)
Danke!!
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@flip1982: Damit auch andere sehen können, was du hingekriegt hast, und davon lernen können:

Code: Alles auswählen

>>> xs = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> xs
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> ys = xs > 5
>>> ys
array([False, False, False, False, False,  True,  True,  True,  True], dtype=bool)
>>> zs = ys * 1 
>>> zs
array([0, 0, 0, 0, 0, 1, 1, 1, 1])
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt mit irgendeiner Zahl zu multiplizieren, sollte man den Typ explizit umwandeln:

Code: Alles auswählen

zs = ys.astype(int)
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@Sirius3: Danke. Hatte vergessen, dass es das gibt. Mein numpy-Fu ist leider klein.
In specifications, Murphy's Law supersedes Ohm's.
Antworten