Sono un laureato in scienze all'università che lavora su un progetto di programmazione per il mio corso Calc III che comporta la decomposizione a valore singolare. L'idea è fondamentalmente di convertire un'immagine di m x n dimensioni in una matrice m x n in cui ogni elemento è una tupla che rappresenta i canali di colore (r, g, b) del pixel nel punto (m, n). Sto usando Python perché è l'unica lingua che ho davvero insegnato finora.Python - NumPy - tuple come elementi di un array
Da quello che posso dire, Python generalmente non ama le tuple come elementi di un array. Ho fatto una piccola ricerca di mio e ho trovato una soluzione, vale a dire, pre-allocare l'array come segue:
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
questo ha funzionato correttamente per la prima parte del compito, che era semplicemente quello di convertire un'immagine in un matrice (non è coinvolta algebra lineare).
La parte con SVD, tuttavia, è dove diventa più complicato. Quando io chiamo la funzione built-in NumPy SVD, utilizzando la matrice ho costruito dalla mia immagine (in cui ogni elemento è una tupla), ottengo il seguente errore:
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.
Questo è lo stesso errore mi è stato sempre inizialmente , prima ho fatto qualche ricerca e ho scoperto che potevo pre-allocare i miei array per consentire le tuple come elementi.
Il problema ora è che sono solo nel mio primo semestre di programmazione (livello universitario), e queste funzioni numpy scritte da e per programmatori professionisti sono un po 'troppo black-box per me (anche se sono sicuro che sono molto più chiari a quelli con esperienza). Quindi modificare queste funzioni per consentire le tuple è un po 'più complicato di quando l'ho fatto sulla mia funzione. Dove devo andare da qui? Suppongo che dovrei copiare le funzioni numPy rilevanti nel mio programma e modificarle di conseguenza?
Grazie in anticipo.
L'SVD funziona solo su matrici. Hai intenzione di fare un SVD per ciascuno dei canali RGB? In altre parole, anche se si forma un array m x n x 3, non è possibile passarlo alla funzione SVD perché gli SVD sono definiti per matrici non tensori di dimensioni arbitrarie. –