Ich bin ein CS-Major in der Universität, der an einem Programmierprojekt für meinen Calc III-Kurs mit Singulärwertzerlegung arbeitet. Die Idee besteht im Wesentlichen darin, ein Bild von m × n Dimensionen in eine m × n Matrix umzuwandeln, wobei jedes Element ein Tupel ist, das die Farbkanäle (r, g, b) des Pixels am Punkt (m, n) darstellt. Ich benutze Python, weil es die einzige Sprache ist, die ich bisher (gut) gelernt habe.Python - NumPy - Tupel als Elemente eines Arrays
Von dem, was ich sagen kann, mag Python Tupel im Allgemeinen nicht als Elemente eines Arrays. Ich habe eine wenig Forschung meines eigenen und eine Abhilfe gefunden, nämlich das Array vor der Zuteilung wie folgt:
def image_to_array(): #converts an image to an array
aPic = loadPicture("zorak_color.gif")
ph = getHeight(aPic)
pw = getWidth(aPic)
anArray = zeros((ph,pw), dtype='O')
for h in range(ph):
for w in range(pw):
p = getPixel(aPic, w, h)
anArray[h][w] = (getRGB(p))
return anArray
Dies korrekt zum ersten Teil der Aufgabe gearbeitet, die einfach ein Bild ein konvertieren waren Matrix (keine lineare Algebra beteiligt).
Der Teil mit SVD ist jedoch, wo es schwieriger wird. Wenn ich rufe die eingebauten in numpy SVD-Funktion, die Array ich von meinem Bild aufgebaut (wobei jedes Element ein Tupel), erhalte ich folgende Fehlermeldung:
Traceback (most recent call last):
File "<pyshell#5>", line 1, in -toplevel-
svd(x)
File "C:\Python24\Lib\site-packages\numpy\linalg\linalg.py", line 724, in svd
a = _fastCopyAndTranspose(t, a)
File "C:\Python24\Lib\site-packages\numpy\linalg\linalg.py", line 107, in _fastCopyAndTranspose
cast_arrays = cast_arrays + (_fastCT(a.astype(type)),)
ValueError: setting an array element with a sequence.
Dies ist der gleiche Fehler war ich immer am Anfang , bevor ich etwas recherchiert habe und festgestellt habe, dass ich meine Arrays vorbelegen könnte, um Tupel als Elemente zuzulassen.
Das Problem ist jetzt, dass ich nur in meinem ersten Semester (College-Level) -Programmierung bin, und diese Anzahl Funktionen von und für professionelle Programmierer sind ein wenig zu Black-Box für mich (obwohl ich sicher bin sind für diejenigen mit Erfahrung viel klarer. Die Bearbeitung dieser Funktionen für Tupel ist etwas komplizierter als bei meiner eigenen Funktion. Wohin muss ich von hier gehen? Ich nehme an, ich sollte die entsprechenden numPy-Funktionen in mein eigenes Programm kopieren und entsprechend ändern.
Vielen Dank im Voraus.
Die SVD nur auf Matrizen funktioniert. Planen Sie eine SVD für jeden der RGB-Kanäle? Mit anderen Worten, selbst wenn Sie ein m x n x 3-Array bilden, können Sie das nicht einfach an die SVD-Funktion übergeben, da SVDs für Matrizen nicht beliebig große Tensoren definiert sind. –