Python (numpy und) list comprehension

OP (Firma: "Konniemara") #4766742
Lesenswert?

Hi!

Ich bin ziemlich neu in Python (3). Möchte gerne in Zukunft damit besser 
zurecht kommen und Sachen die ich früher mit Matlab gemacht habe mit 
Python erschlagen.

Ist aber ein ziemlicher Brocken. Die Matlab-Phse an sich ist schon etwas 
her und ich tue mich traditionell etwas schwer mit Skript-Sprachen. 
Speziell die Art wie in Python Arrays verarbeitet werden gewinnt derzeit 
noch gegen mein Hirn. Anscheinend.

Also das paket numpy habe ich als sinnvolle Matlab alternative gefunden 
und probiere rum. Aber wie gesagt durch meinen Lernstatus kommt da 
anscheinend einiges durcheinander. Wäre froh um Erhellung!

Im Beispiel wollte ich ursprünglich bei einem Bild den Rot-Kanal vom 
Grün-Kanal abziehen. Ohne Sinn - nur um besser rein zu kommen. Ist aber 
grandios gescheitert ich schaffe es nicht mal über das geladene Bild 
Pixelweise zu iterieren. Folgender Code wird ausgeführt (immerhin) aber 
das Bild stimmt nicht mit original überein. Jeweils Pixel subtrahieren 
schaffe ich gar nicht:
1
import matplotlib.pyplot as plt
2
import matplotlib.image as mpimg
3
import numpy as np
4

5
image_path = "tst.bmp"
6

7
im = mpimg.imread(image_path)
8

9
im_neu = np.array([im[x,y,:] for y in range(im.shape[1]) for x in range(im.shape[0])])
10
#mentale Zerrung-wie gehts? MUSS ich zwingend noch mal in np.array zurück wandeln? #Kann ich nicht auf Array-Ebene bleiben und wie 'ginge' das mit einer #liste richtig?
11

12
im_neu = np.reshape( im_neu, (im.shape[0],im.shape[1],3) )
13
#Leider Dimension verloren
14

15
plt.imshow(im_neu)

Wie geht das und wo ist mein Verständnisfehler?
OP (Firma: "Konniemara") #4766886
Lesenswert?

1
import matplotlib.pyplot as plt
2
import matplotlib.image as mpimg
3
import numpy as np
4
from copy import deepcopy
5
#from PIL import Image
6

7
image_path = "tst.bmp"
8

9
im = mpimg.imread(image_path)
10
im_neu = np.zeros((im.shape[0],im.shape[1],3)).astype(np.uint8)
11

12

13
for r in range(im.shape[0]):
14
     for c in range(im.shape[1]):
15
        im_neu[r,c]=im[r,c,0]-im[r,c,1]
16

17
plt.imshow(im_neu)


Rumprobieren hat mich hier hin gebracht. Aber damit geht jetzt das 
Schöne an Python Code flöten.
Also - wie würde ich das sinnvoller machen?
#4766913
Lesenswert?

Ist mit der numpy-Denke ganz easy:
1
img_neu = np.transpose([img[...,:,0]-img[...,:,1], img[...,:,1], img[...,:,1]], axes=(1,2,0))
img_neu ist dann ein Farbbild mit rot = rot-grün.

Wem das mit den slices zu komisch ist:
1
r,g,b= np.transpose(img, (2,0,1))
2
img_neu = np.transpose([r-g,g,b], axes=(1,2,0))

Python und numpy haben hier recht verschiedene Ansätze davon, wie sowas 
funktioniert. Wenn man bei numpy list comprehensions braucht, macht man 
i.d.R. was falsch.
OP (Firma: "Konniemara") #4767841
Lesenswert?

cool,
ich habe aber jetzt das Gefühl ich sollte unbedingt versuchen nicht zu 
schnell zu viel anzugehen und eins nach dem anderen zu begreifen.
Nachher ist alles ein kunterbunter Mix als halbgarem Zeug was dann noch 
schwieriger ist zu ordnen.

Jeder weiß ja dass lesen und nachvollziehen was anderes ist als aktiv 
tun. Aber bis jetzt mag ich trotz eine gewissen Ähnlichkeit die matlab 
Notation mehr. Mag Gewohnheit sein.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren