Anfänger-Problem mit Matrizen

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
cpt.buzz
User
Beiträge: 4
Registriert: Freitag 16. Dezember 2011, 10:38

Hi! Bin blutiger Anfänger und habe ein Matrizen-Problem:

Code: Alles auswählen

import numpy as np
import pylab as pl
import scipy
import matplotlib
from numpy.fft import fft2, ifft2

pixelnr = 4
x = 0.5
y = 4
alpha = 3.14159/4

pi = 3.14159
pixelarray = np.arange(1-(pixelnr/2+1), pixelnr+1-(pixelnr/2))
d = np.arange(1, pixelnr+2)

for d in xrange(1, pixelnr+2):
    for pixelarray in range(1-(pixelnr/2+1), pixelnr+1-(pixelnr/2)):
        pixel = [(((((d-(pixelnr/2+1))*(np.cos(alpha)))+(np.sin(alpha)*pixelarray))/x)**2+((((-d+(pixelnr/2+1))*np.sin(alpha))+(np.cos(alpha)*pixelarray))/y)**2)]
        print pixel
Dieses Programm wirft mir am Ende zwar die richtigen Arrays aus, aus denen die Matrix bestehen soll, allerdings schaffe ich es nicht, die als Matrix zusammenzufügen.

Würde mich über Hilfe freuen!

Cpt.buzz
BlackJack

@cpt.buzz: Python- und Numpy-Grundlagen lernen würde ich mal sagen. Du löst das im Moment mit Numpy so wie man es in reinem Python ohne Numpy machen würde, nämlich in dem Du zwei explizite Schleifen in Python schreibst, die jeden Wert einzeln berechnen. Dazu braucht man kein Numpy. Bei dem Lösungsweg fehlt Dir anscheinend das Grunlagenwissen über Listen in Python. Jedes einzelne Ergebnis alleine in einer Liste zu verpacken ist zum Beispiel ziemlich sinnfrei.

Wenn Du es mit Numpy lösen möchtest, dann musst Du es so formulieren dass sich die Rechenoperationen nicht auf einzelne Werte beziehen, sondern auf ein ganzes Numpy-Array angewendet werden. Dann laufen die Schleifen innerhalb der Numpy-Array-Datentypen ab. Da die in C und teilweise Fortran implementiert sind, geht das dann in der Regel deutlich schneller als Schleifen im Python-Code.

Etwas verwirrend ist auch, dass Du `pixelarray` und `d` vor der Schleife an Werte bindest, die nie verwendet werden. Und das in der Schleife `pixelarray` an einzelne Werte gebunden wird. Bei dem Namen würde man keinen Skalar, sondern eben tatsächlich ein Array erwarten.

Nachtrag: Eine Variante ohne explizite Schleifen in Python:

Code: Alles auswählen

import numpy as np


pixelnr = 4
pixelnr_b = pixelnr / 2 + 1
x = 0.5
y = 4
alpha = np.pi / 4
sin_alpha = np.sin(alpha)
cos_alpha = np.cos(alpha)

pixelarray = np.arange(1 - pixelnr_b, pixelnr + 1 - (pixelnr / 2))
d = np.array(np.arange(1, pixelnr + 2), ndmin=2).T.repeat(len(pixelarray), 1)

pixels = (
    (((d - pixelnr_b) * cos_alpha + (sin_alpha * pixelarray)) / x)**2
    + (((-d + pixelnr_b) * sin_alpha + (cos_alpha * pixelarray)) / y)**2
)
print pixels
cpt.buzz
User
Beiträge: 4
Registriert: Freitag 16. Dezember 2011, 10:38

Danke!
Antworten