Python – NumPy – tuples como elementos de una matriz

Soy un especialista en CS en la universidad que trabaja en un proyecto de progtwigción para mi curso Calc III que involucra la descomposición de valor singular. La idea es básicamente convertir una imagen de dimensiones mxn en una matriz mxn en la que cada elemento es una tupla que representa los canales de color (r, g, b) del píxel en el punto (m, n). Estoy usando Python porque es el único idioma que realmente me han enseñado (bien) hasta ahora.

Por lo que puedo decir, a Python generalmente no le gustan las tuplas como elementos de una matriz. Hice una pequeña investigación por mi cuenta y encontré una solución alternativa, a saber, la asignación previa de la matriz de la siguiente manera:

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 

Esto funcionó correctamente para la primera parte de la tarea, que consistía simplemente en convertir una imagen en una matriz (no involucraba álgebra lineal).

La parte con SVD, sin embargo, es donde se vuelve más complicado. Cuando llamo a la función numPy svd incorporada, utilizando la matriz que construí desde mi imagen (donde cada elemento es una tupla), aparece el siguiente error:

 Traceback (most recent call last): File "", 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. 

Este es el mismo error que estaba recibiendo inicialmente, antes de investigar un poco y descubrí que podía preasignar mis arreglos para permitir tuplas como elementos.

El problema ahora es que solo estoy en mi primer semestre de progtwigción (a nivel universitario), y estas numerosas funciones escritas por y para progtwigdores profesionales son un poco demasiado negras para mí (aunque estoy seguro de que son mucho más claras) para aquellos con experiencia). Así que editar estas funciones para permitir tuplas es un poco más complicado que cuando lo hice en mi propia función. ¿Dónde necesito ir desde aquí? ¿Supongo que debo copiar las funciones numéricas relevantes en mi propio progtwig y modificarlas en consecuencia?

Gracias por adelantado.

En lugar de establecer el tipo de elemento de matriz en ‘O’ (objeto), debe configurarlo en una tupla. Vea el manual de SciPy para algunos ejemplos.

En tu caso, lo más fácil es usar algo como

 a = zeros((ph,pw), dtype=(float,3)) 

Suponiendo que sus valores RGB son tuplas de 3 números de punto flotante.

Esto es similar a crear una matriz 3d (como sugirió Steve) y, de hecho, se accede a los elementos de la tupla como a[n,m][k] o z[n,m,k] donde k es el elemento en la tupla .

Por supuesto, la SVD se define para matrices 2d y no para matrices 3d, por lo que no puede usar linalg.svd (a). Debe decidir la SVD de qué matriz (de las tres posibles: RG y B) necesita.

Si, por ejemplo, desea que la SVD de la matriz “R” (suponiendo que es el primer elemento de la tupla) use algo como:

 linalg.svd(a[:,:,1]) 

Creo que quieres un ph by pw by 3 numpy array.

 anArray = zeros((ph,pw,3)) for h in range(ph): for w in range(pw): p = getPixel(aPic, w, h) anArray[h][w] = getRGB(p) 

Solo debe asegurarse de que getRGB devuelva una lista de 3 elementos en lugar de una tupla.