Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Python
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-03-2024
gusspagano gusspagano is offline
Miembro
 
Registrado: mar 2012
Posts: 47
Poder: 0
gusspagano Va por buen camino
Lista bidimensional de python a txt

Antes que nada, gracias por su tiempo y su generosa ayuda.

Tengo un archivo txt conformado por 344,160 lineas. Cada linea tiene 3 valores: coordenada x, coordenada y, dato. Estos 3 valores estan separados por espacio. Ej: 338619.4247572054 2304584.9999724245 -10.0.

Lo que intento es meter estos 344,160 datos en una lista bidimensional de tamaño 100 x 100. Utilizo las coordenadas x, y de cada linea para calcular la columna y renglon en la cual debo colocar cada dato. Dado que la lista unicame tiente 10,000 posiciones (100x100 = 10,000) y el txt tiene 344,160 datos, muchos datos van a caer dentro de una misma posición dentro de la lista, por lo cual estoy haciendo un promedio. Por otra parte, habran posiciones dentro de la lista en los cuales no caerá ningún dato. A estas posiciones de la lista les agrego el valor -9999 para indicar que es un dato nulo.

El proceso que sigo es el siguiente:
  • creo una lista vacia (lista = []) a la cual posteriormente agrego 100 veces dato nulo (-9999)
  • creo otra lista vacia (listadatos = []) a la cual agrego 100 veces la lista anterior
  • viciamos la lista "lista":lista = [] y la llenamos ahora con 100 datos = 0
  • creamos otra lista vacia llamada "listacant" la cual contiene la cantidad de datos que han caido en cada posición de la lista "listadatos"
  • llenamos listacant con 100 veces la lista "lista"


De este modo tengo dos lista. listadatos que contiene hasta ahora 10,000 valores iguales a -9999 y listacant que cotiene 10,000 valores iguales a cero.
para promediar los datos y colocarlos en listadatos, verifico en primer lugar si la posición ya contiene valores distintos a -9999 o no, y deacuerdo con esto hago el promedio.



Código:
for i in range (344160):
            linea = temp_arc.readline()                                            # lee una linea del txt   
            xdato, ydato, zdato = linea.split(' ')                                # se obtienen coordenadas y dato por separado
            ncol = math.trunc ( ( float ( xdato ) - xmin ) / rsl )         # calculo de columna. rsl = resolución
            nfil = math.trunc ( ( ymax - float ( ydato ) ) / rsl )         # calculo de fila 
            if listadatos[ncol][nfil] == -9999:                                 # 
                listadatos[ncol][nfil] = float ( zdato )
            else:
                listadatos[ncol][nfil] = ( ( listadatos[ncol][nfil] 
                                         * listacant[ncol][nfil] 
                                         + float (zdato) ) 
                                          / ( listacant[ncol][nfil] + 1 ) )
            listacant[ncol][nfil] += 1
El problema es que al verificar el resutado, el codigo me pone 100 veces el mismo dato para una misma fila. la siguiente fila tiene un dato distinto que igualmente se repite 100 veces y así suscecivamente.
antes habia hecho el codigo con delphi y corria sin problemas, pero aquí no entiendo que pasa.

Me disculpo por lo extenso de mi consulta y ojala alguien pueda darme una pista de lo que estoy haciendo mal.

Saludos y gracias nuevamente.

Última edición por Casimiro Notevi fecha: 11-03-2024 a las 21:33:44.
Responder Con Cita
  #2  
Antiguo 12-03-2024
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.757
Poder: 21
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
No es necesario calcular el promedio cada vez que modificas una celda.
Creo que lo mejor es dividirlo en varios pasos.
Además no creo que debas utilizar el valor -9999 como indicador de nulo. Yo simplemente dejaría la celda con un 0.

Te dejo un pseudocódigo Delphi:
Código Delphi [-]
lista_val = array[344160];
lista_Can = array[100, 100];
lista_Sum = array[100, 100];


// Inicializamos listas ----------
RellenarListaValores(lista_val);
RellenarConCeros(lista_Can);
RellenarConCeros(lista_Sum);


// Acumulamos valores ------------
for i = 0 to lista_val.Count do
begin
  // Dividimos la linea leida en 3 valores
  ObtenerDatos(lista_val[i], x, y, z);
  
  // Averiguamos en qué posición debe guardar el valor
  CalcularPosicion(x, y, columna, fila);
  
  // incrementamos la cantidad de 
  lista_Can[columna, fila] := lista_Can[columna, fila] + 1;
  
  // Sumamos el valor leido
  lista_Sum[columna, fila] := lista_Sum[columna, fila] + z;
end;

  
// Calculamos promedios ----------
for Columna = 1 to 100 do
begin
  for Fila = 1 to 100 do
    if lista_Can[columna, fila] <> 0 then
       // Calculo Promedio
       lista_Sum[columna, fila] := lista_Sum[columna, fila] / lista_Can[columna, fila]
    else     
       // No hay datos y se considera nulo
       lista_Sum[columna, fila] := -9999;
end;
Responder Con Cita
  #3  
Antiguo 16-03-2024
gusspagano gusspagano is offline
Miembro
 
Registrado: mar 2012
Posts: 47
Poder: 0
gusspagano Va por buen camino
Cierto, no es necesario promediar cada vez.

Tengo un código en delhi que corre sin problemas. La cosa es que quiero hacerlo con python porque, posterirmente voy a utlizar este código en QGis. En python no hace lo que debería y no entiendo por qué.

Gracias por tu ayuda!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Array bidimensional dinámico harpo Varios 3 31-03-2015 16:11:17
Tutorial de Python 'Python para todos' marcoszorrilla Noticias 11 15-02-2009 06:19:15
Liberar array bidimensional de botones Raze Varios 2 16-05-2006 14:45:14
Llenar un arreglo bidimensional ... Luli Varios 8 23-03-2005 13:22:06
arreglo bidimensional Luli Varios 7 22-01-2005 14:09:44


La franja horaria es GMT +2. Ahora son las 01:25:36.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi