Kapitel 30
Rechnen mit NumPy
886
Abb. 30.15: Nach Druck auf die rechte Schaltfläche wird der versteckte Text aus dem Bild
herausgeholt und im Textfenster dargestellt. (Der Text besteht nur aus kleinen
Buchstaben.)
30.19 Lösungen
Lösung 1
Lösung 2
Skript:
Nr. Operation
0
a = np.arange(8)
1
b = np.reshape(a, (2,4))
2
c = b.T
3
d = c[:2]
4
e = d.ravel()
5
f = e + np.ones((4,4), dtype=int)
6
g = e**2
# aufgabe_2.py
import numpy as np
import matplotlib.pyplot as plt
bins = np.arange(1,13)+0.5 #1
d1, d2 = np.random.randint(1, 7, (2, 100)) #2
plt.figure()
887
30.19
Lösungen
Erläuterung:
#1: Folge von Zahlen, die später im Histogramm Intervallgrenzen darstellen: 1.5, 2.5, ...
12.5
.
#2: Hier werden zwei Folgen von ganzen Zufallszahlen zwischen 1 und 6 gebildet.
#3: Zunächst werden für die 100 Würfe die Summen der beiden gewürfelten Zahlen gebil-
det und dann für jede dieser Zahlen festgestellt, in welchem der 12 Intervalle
[1.5, 2.5],
[2.5, 3.5], ..., [11.5, 12.5] sie vorkommt. Für jedes der 12 Intervalle zeigt ein senkrech-
ter Balken an, wie viele Würfelsummen in diesem Intervall liegen.
Lösung 3
Skript:
Erläuterung:
#1: Hier wird eine Folge ganzer Zahlen von 1 bis 24 erzeugt.
#2: Die angegebene Textdatei wird geöffnet und aus den Daten ein zweidimensionales Array
mit 6 Spalten und 24 Zeilen erzeugt. In jeder Zeile der Textdatei stehen sechs Zahlen, die
durch ein Semikolon getrennt sind.
plt.hist(d1 + d2, bins, facecolor="b") #3
plt.title("100 Würfe mit zwei Würfeln")
plt.grid(True)
plt.show()
# aufgabe_3.py
import numpy as np
import matplotlib.pyplot as plt
hours = np.arange(1, 25) #1
data = np.loadtxt("dmd2_17_07_2016.csv", delimiter=";") #2
no, no2, o3, fs, wg, wr = data.T #3
plt.figure()
plt.subplot(1, 2, 1) #4
plt.plot(hours, no + no2) #5
plt.title ("Stickstoffoxide (μg/m³)")
plt.xlabel("Uhrzeit")
plt.axis([1, 24, 0, 100]) #6
plt.subplot(1, 2, 2) #7
plt.plot(hours, o3)
plt.title ("Ozon (μg/m³)")
plt.xlabel("Uhrzeit")
plt.axis([1, 24, 0, 100])
plt.show()
Kapitel 30
Rechnen mit NumPy
888
#3: Bei der Transposition werden aus Spalten Zeilen. Das transponierte Array data.T hat
sechs Zeilen mit 24 Elementen. Das sind die Messwerte einer Kategorie, die zu jeder vollen
Stunde aufgenommen worden sind. Hier werden sechs eindimensionale Arrays erzeugt, die
aus diesen sechs Zeilen gebildet werden. Wir benötigen aber später nur die ersten drei
Arrays
no, no2 und no3.
#4: Mit den ersten beiden Argumenten von subplot() wird das Layout auf dem Bildschirm
festgelegt. Wir haben eine Zeile mit zwei Spalten, also zwei Plots nebeneinander. Das dritte
Argument ist die laufende Nummer des Diagramms, das in den folgenden Anweisungen
definiert wird.
#5: Auf der x-Achse sind die Uhrzeiten (1 bis 24), auf der y-Achse werden die Messwerte
(Summe der beiden Stickstoffoxid-Konzentrationen) dargestellt. Für alle anderen Aspekte
des Diagramms werden die Voreinstellungen übernommen.
#6: Hier wird die Skalierung der beiden Achsen festgelegt (kleinster und größter Wert auf
der x-Achse und kleinster und größter Wert auf der y-Achse). Das überlassen wir nicht der
Automatik. Dann kann man die beiden Diagramme besser vergleichen.
#7: Hier beginnt die Definition des zweiten Plots.
Lösung 4
Diese einfache Lösung geht davon aus, dass es eine feste Bilddatei mit dem Originalbild
gibt. Das veränderte Bild kann über einen Dialog frei gewählt werden und wird dann mit
dem Original verglichen.
Skript:
# stegano_find.py
from tkinter import *
from PIL import Image, ImageTk
import numpy as np
LETTERS = " abcdefghijklmnopqrstuvwxyzßäöü"
class App:
def __init__(self):
self.window = Tk()
self.label = Label(self.window)
self.label.pack()
self.text = Text(self.window,
width=50, height=5, wrap=WORD)
self.text.pack(anchor=W)
self.loadButton.pack(side=LEFT)
self.loadButton=Button(master=self.window,
text="Bild laden und Text finden",
command=self.load)
self.original = Image.open("Thailand_2.png") #1
w, h = self.original.size
889
30.19
Lösungen
Erläuterung:
#1: Zum Originalbild (PIL.Image-Objekt) wird ein dreidimensionales Array gebildet.
#2: Über ein Dialogfenster wählt der Benutzer den Dateinamen eines Bildes. Falls der
Benutzer den Dialog abbricht, ist
filename leer und die Ausführung der Methode wird
abgebrochen
#3: Die Bilddatei wird geöffnet, ein PIL.Image-Objekt erzeugt und daraus schließlich ein
Array gebildet.
#4: Das geladene Bild wird (als tkinter.PhotoImage-Objekt) auf das Label gesetzt und
sichtbar gemacht.
#5: Auch zu dem Originalbild wird ein Array gebildet; denn wir wollen ja die effizienten
Array-Operationen verwenden.
self.imgTk = ImageTk.PhotoImage(self.original)
self.label.config(image=self.imgTk,
width=w, height=h)
self.window.mainloop()
def load(self):
filename = filedialog.askopenfilename() #2
if not filename:
return
img = Image.open(filename)
a = np.array(img) #3
self.imgTk = ImageTk.PhotoImage(img)
self.label.config(image=self.imgTk) #4
a_o = np.array(self.original) #5
if a.shape != a_o.shape: #6
self.text.insert(END, "Bild passt nicht!")
return
green_o = a_o[:,:,1].clip(max=215) #7
green = a[:,:,1] #8
numbers = (green - green_o).ravel() #9
self.text.delete(1.0, END) #10
secret = ""
for i in numbers: #11
secret += LETTERS[i]
if len(secret) > 3:
if secret[-3:] == " ":
self.text.insert(END, secret)
return
App()

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.