Soy un CS major en la universidad trabajando en un proyecto de programación para mi curso Calc III que involucra la descomposición de valores singulares. La idea es básicamente convertir una imagen de m x n dimensiones en una matriz m x n 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 he sido (bien) enseñado hasta ahora.Python - NumPy - tuplas como elementos de una matriz
Por lo que puedo decir, a Python generalmente no le gustan las tuplas como elementos de una matriz. Hice un poco de investigación de mi propia y encontré una solución, es decir, antes de la asignación 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 durante la primera parte de la tarea, que era simplemente para convertir una imagen a una matriz (sin álgebra lineal involucrada).
La parte con SVD, sin embargo, es donde se vuelve más complicado. Cuando llamo a la función integrada de numpy SVD, utilizando la matriz he construido a partir de mi imagen (donde cada elemento es una tupla), me sale el siguiente error:
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.
Este es el mismo error que estaba inicialmente , antes de hacer algunas investigaciones y descubrí que podía asignar previamente mis matrices para permitir que las tuplas se convirtieran en elementos.
El problema ahora es que solo estoy en mi primer semestre de programación (a nivel universitario), y estas funciones numéricas escritas por y para programadores profesionales son un poco demasiado negras para mí (aunque estoy seguro de que están mucho más claros 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. ¿A dónde debo ir desde aquí? Supongo que debería copiar las funciones numPy relevantes en mi propio programa, y modificarlas en consecuencia?
Gracias de antemano.
La SVD solo funciona con matrices. ¿Planeas hacer una SVD para cada uno de los canales RGB? En otras palabras, incluso si se forma una matriz m x n x 3, no se puede pasar simplemente a la función SVD porque las SVD se definen para matrices que no tienen tensores de tamaño arbitrario. –