Re: [Python-es] matriz de matrices irregulares en longitud
Hola a todos, Hace tiempo escribí esto, igual te sirve aunque falta pulirlo. Saludos. #!/usr/bin/env python # -*- coding: utf-8 -*- class Vector(list): '''Vector de tamaño fijo con/sin comprobación de tipo''' def __new__(cls, *args, **kwargs): # Internamente los elementos del vector se almacenan en una lista. return list.__new__(cls, *args, **kwargs) def __init__(self, length, default_value=None, initial_values=None, typed=True): # El vector tendrá el tamaño indicado por length. # Los elementos del vector se inicializan con los elementos de initial_values. # Si len(initial_values) length el vector se rellena con default_value # hasta alcanzar la longitud requerida. # Si len(initial_values) length se descartan los elementos de initial_values # con indice mayor a length. # Si todos los elementos de initial_values y default_value tienen el mismo # tipo el vector será de dicho tipo y solo podra almacenar valores de # ese tipo. En caso contrario el vector no tendra tipo y podra almacenar # elementos de cualquier tipo. # Si typed == False no se tendra en cuenta el tipo de los elementos. try: same_type = True l = len(initial_values) for i in range(length): if i l: self.append(initial_values[i]) same_type = same_type and (type(default_value) == type(initial_values[i])) else: self.append(default_value) except: self.extend([default_value]* length) finally: self.__length = length self.__type = type(default_value) if (same_type and typed) else type(None) def __setitem__(self, index, value): # Comprobamos el tipo antes de insertar un elemento. if self.__type == type(value) or self.__type == type(None): super(Vector, self).__setitem__(index, value) else: # Elemento de tipo incorrecto, no se inserta. raise ValueError def __setslice__(self, i, j, sequence): # Impedimos este método para que altere el tamaño del vector. # TODO: hacer lo mismo con el resto de métodos de la clase list que # pueden cambiar el tamaño del vector. raise ValueError # FIXME: poner la excepción correcta. def __count__(self): return self.__length @property def type(self): return self.__type @property def length(self): return self.__length class Matrix(Vector): '''Matriz bidimensional de tamaño fijo con/sin comprobación de tipo''' def __init__(self, cols, rows, default_value=None, initial_values=None, typed=True): # Indicamos el número de columnas y filas de la matriz. self.__cols = cols self.__rows = rows super(Matrix, self).__init__(cols * rows, default_value, initial_values, typed) def __setitem__(self, index, value): # FIXME: interceptar índices no válidos. col, row = index index = self.__cols * row + col super(Matrix, self).__setitem__(index, value) def __getitem__(self, index): # FIXME: interceptar índices no válidos. col, row = index index = self.__cols * row + col return super(Matrix, self).__getitem__(index) def __repr__(self): result = for i in range(0, self.length, self.cols): result += [%s] % , .join([str(s) for s in self[i: i + self.cols]]) return [%s] % result def __str__(self): result = for i in range(0, self.length, self.cols): result += %s\n % .join([str(s) for s in self[i: i + self.cols]]) return result @property def cols(self): return self.__cols @property def rows(self): return self.__rows def row(self, index): '''Devuelve la fila con índice index''' # FIXME: comprobar limites i = index * self.__cols return self[i:i + self.__cols] def col(self, index): '''Devuelve la columna con índice index''' # FIXME: comprobar limites return [self[index, i] for i in range(self.__cols)] def submatrix(self, ix, iy, jx, jy): '''Devuleve una submatrix de la matrix''' m = [] for y in range(iy, jy + 1): k = y * self.__cols m.append(self[k + ix:k + jx + 1]) # OJO!! el valor devuelto es un lista y no de la clase matrix return m def list(self): '''Devuleve los elementos de la matrix como una lista''' return list(self) def sublist(self, ix, iy, jx, jy): '''Devuleve una submatrix de la matrix en forma de lista''' l = [] for y in range(iy, jy + 1): k = y * self.__cols l.extend(self[k + ix:k + jx + 1]) # OJO!! el valor
Re: [Python-es] matriz de matrices irregulares en longitud
On Apr 25, 2012, at 4:09, Kiko kikocorre...@gmail.com wrote: Hola. Llevo un rato pensando en diferentes formas de como almacenar una información y creo que ninguna de ellas es muy bonita. Os explico el problema a ver si alguna de vuestras ocurrencias es más pythonica/bonita que las mias. Quiero almacenar en una matriz (o lo que sea) rectangular una matriz en cada posición. La matriz en cada posición no tiene que tener la misma longitud en todas las posiciones pero sí que tendrá dos variables. Por ejemplo, matriz 25x25, en la posición [0,0] quiero almacenar una matriz [2,n], en la posición [0,1] quiero almacenar una matriz [2,m],..., en la posición [24,24] quiero almacenar una matriz [2,s] n,m,..., s no tienen que ser el mismo número. Cual es la pregunta? ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] matriz de matrices irregulares en longitud
Hola Kiko, No tengo claro las acciones que luego necesitas hacer con esas matrices. Pero dependiendo de lo que sea o de las búsquedas/operaciones que tengas que hacer igual puedes usar los arrays de numpy para montar las matrices. A mi no me parece mal del todo montarlo con listas, me parece bastante intuitivo y sería mi primera idea, pero lo dicho, dependiendo de lo que luego quieras hacer con esas estructuras. Saludos, Raúl 2012/4/25 Kiko kikocorre...@gmail.com El 25 de abril de 2012 13:03, G V nada...@gmail.com escribió: no termino de ver el problema que tienes, es un array de n dimensiones, en este caso 4 y solo las 2 primeras tienen un requisito de ser iguales. ¿no? Quizás si nos das algo de codigo veamos mejor tu problema. La otra opcion que se me ocurre es definir una clase para el dato, donde decidas cual es el formato mas conveniente y meterlo en una matriz. Pero estoy seguro de que ambas opciones las has pensado, por lo que no termino de ver tu problema. No hay problema. Puedo hacer listas de listas, diccionarios, pero no sé, como que lo veo un poco feo y se me había ocurrido ver si alguien (toda la gente de esta lista tiene más experiencia que yo) aportaba algo más 'limpio'. Solo eso. ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- Raúl Cumplido ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] matriz de matrices irregulares en longitud
On Apr 25, 2012, at 7:08, Kiko kikocorre...@gmail.com wrote: El 25 de abril de 2012 13:03, G V nada...@gmail.com escribió: no termino de ver el problema que tienes, es un array de n dimensiones, en este caso 4 y solo las 2 primeras tienen un requisito de ser iguales. ¿no? Quizás si nos das algo de codigo veamos mejor tu problema. La otra opcion que se me ocurre es definir una clase para el dato, donde decidas cual es el formato mas conveniente y meterlo en una matriz. Pero estoy seguro de que ambas opciones las has pensado, por lo que no termino de ver tu problema. No hay problema. Puedo hacer listas de listas, diccionarios, pero no sé, como que lo veo un poco feo y se me había ocurrido ver si alguien (toda la gente de esta lista tiene más experiencia que yo) aportaba algo más 'limpio'. Solo eso. ___ Caso complicado... Ayudar a quien no tiene un problema... ;) La idea que se me ocurre es, teniendo en cuenta que parece que al final tienes siempre pares de datos (las segundas matrices de las que hablas son siempre 2xN), implementar una clase con dos atributos. Y luego haces una matriz 24x24 con listas de objetos de esa clase.___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] matriz de matrices irregulares en longitud
Caso complicado... Ayudar a quien no tiene un problema... ;) José, creeme, tengo muchos problemas ;-) Himport numpy as N class Metamat: def __init__(self,nx,ny): x = [0 for i in range(nx)] self.M = [x for i in range(ny)] def __getitem__(self,l): i,j = l return self.M[i][j] def __setitem__(self,l,algo): i,j = l self.M[i][j] = algo if __name__ == '__main__': m = Metamat(5,6) print m[1,1] m[1,1] = N.array(((1,1),(2,2))) print m[1,1] Jaime, gracias, algo así se me estaba ocurriendo pero no sabía si era muy retorcido y lógico y he preferido preguntar antes. Hmm, un lista de listas: x = [ [1,2,3,4], [5,6,7,8], [1,2,3,4], [5,6,7,8], ] Me parece algo... normal, no le veo nada feo. Andrei, Gracias por confirmar que mi lógica no es tán ilógica \o/, es que siempre pienso en cuadriculado y regular y cuando algo se dispersa de eso me pierdo... Muchas gracias a todos. ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/