Promedio de los 5 valores menores en un arreglo mediante un script de Python

El amigo Pablogis, en la web de Gabriel Ortiz, tiene el problema de encontrar en un ráster la distancia media a los 5 puntos más cercanos de una línea con 300 puntos y luego volcarlos, para cada píxel, en un nuevo ráster. Resolver este problema dentro de ArcGis o QGIS puede ser retador pero con Python las cosas podrían simplificarse. Un procedimiento posible sería determinar las 300 distancias a cada píxel, pasarlas a través de una función de ordenamiento y que devuelva el promedio de las 5 menores. Como un ráster presenta, generalmente, una buena cantidad de filas por columnas (por ejemplo, 1000 x 1000 ya involucraría un millón de cálculos de ese tipo) el tiempo de cálculo podría ser limitante. No obstante, vamos a hacer la prueba.

Del Blog The BeAsTiEuX tomé este código:

Código Python – Ordenamiento Burbuja

y lo adapté a éste otro (py_ordenar.py):

#!/usr/bin/env python
# -*- coding: utf-8

from os import system
import numpy as np

system("clear")

#Definición de funciones

def ordenamientoBurbuja(lista,tam):
    for i in range(1,tam):
        for j in range(0,tam-i):
            if(lista[j] > lista[j+1]):
                k = lista[j+1]
                lista[j+1] = lista[j]
                lista[j] = k;

def promedio_5_Lista(lista,tam):

	sum = 0
	
	for i in range(0, 5):
		sum += lista[i]	
	
	return sum/5
 
#Comienzo del programa
 
A=[15.30, 25.80, 1.52, 8.71, 2.35, 12.37, 1.55, 22.42]

print "Espere..."

pfile=open('media_5min.asc','w')

d_5min = np.zeros((3603,3630))

for i in range(3630):
	for j in range(3603):

		ordenamientoBurbuja(A,len(A))
		B=promedio_5_Lista(A,len(A))
		d_5min[i][j] = B
		pfile.write(str(d_5min[i][j],)+" ")
	pfile.write("\n")

pfile.close()

print "Listo!"

donde al final se realiza, a modo de prueba, el procedimiento de ordenamiento tipo burbuja (que es uno de los ordenamientos más ineficientes) para un arreglo de 8 valores float (no 300 como es el requerimiento). Para el arreglo ordenado se determina el promedio de los 5 primeros valores con escritura al archivo media_5min.asc, en formato matricial de 3630 filas x 3603 columnas, a modo de ráster de 13.078.890 píxeles.

La ejecución del código produjo el siguiente resultado:

Espere...
Listo!

real	3m38.799s
user	3m36.654s
sys	0m0.512s
zeito@debian:~$ 

lo que señala la posible viabilidad de encontrar un procedimiento para producir el ráster porque 3 minutos y medio es un buen tiempo para algo más de 13.000.000 de “cálculos”. La obtención del ráster con las distancias será la meta de un post futuro.

Esta entrada fue publicada en Código Python, Teledetección. Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s