Re: [Python-es] matriz de matrices irregulares en longitud

2012-04-27 Por tema Jesús Curbelo Rodríguez

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

2012-04-25 Por tema Jose Caballero




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

2012-04-25 Por tema Raúl Cumplido
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

2012-04-25 Por tema Jose Caballero




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

2012-04-25 Por tema Kiko
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/