2010-11-11 15 views
6

Estoy trabajando con la salida del modelo por el momento, y parece que no se me ocurre una buena manera de combinar dos conjuntos de datos. Las matrices A y B almacenan datos diferentes, y las entradas en cada una corresponden a algún punto espacial (x, y): A contiene algún parámetro y B contiene la salida del modelo. El problema es que B es una subsección espacial de A, es decir, si el modelo fuera para todo el mundo, A almacenaría el parámetro en cada punto del planeta, y B almacenaría la salida del modelo solo para aquellos puntos en África. .¿Dónde dos matrices en 2-D comienzan a superponerse entre sí?

Así que tengo que encontrar cuánto B está desviado de A, en otras palabras, necesito encontrar los índices en los que empiezan a superponerse. Entonces, si A.shape = (1000,1500), ¿B es (750: 850, 200: 300) parte de eso, o la subsección (783: 835, 427: 440)? Tengo matrices asociadas con A y B que almacenan las posiciones (x, y) de los puntos de malla para cada uno.

Esto parece ser un problema simple: encuentre dónde se superponen las dos matrices. Y puedo resolverlo con el KDTree de scipy.spatial simplemente, pero es muy lento. ¿Alguien tiene mejores ideas?

+1

La respuesta a esta pregunta realmente depende del tipo de cuadrícula que tenga. ¿Es una grilla cartesiana igualmente espaciada? –

+1

¿Están las coordenadas ascendiendo tanto horizontal como verticalmente para las posiciones de los puntos de la red de A y B? Si es así, simplemente haz algunas búsquedas binarias. –

+0

Si se trata de un mapa climático global, ¿B corresponde a una región geográfica como África (es decir, algo que no sería exactamente de forma rectangular) o es solo una subsección rectangular? –

Respuesta

1

Tengo arreglos asociados con A y B que almacenan las posiciones (x, y) de los puntos de la red para cada uno.

En ese caso, la respuesta debería ser bastante simple ...

son las dos rejillas estrictamente en el mismo esquema cuadriculado? Suponiendo que son, sólo puede hacer algo como:

np.argwhere((Ax == Bx.min()) & (Ay == By.min())) 

Suponiendo coordenadas del mundo de las dos rejillas aumentar en la misma dirección que los índices del de las redes, esto da a la esquina inferior izquierda de la cuadrícula subestablecida. (Y si no aumentan en la misma dirección (es decir, negativo o dxdy), sólo se da una de las otras esquinas)

En el siguiente ejemplo, se podría, obviamente, sólo calcular los índices del adecuados de ix = (Bxmin - Axmin)/dx, etc. , pero suponiendo que tienes un sistema de grillado más complejo, esto seguirá funcionando. Sin embargo, esto supone que las dos cuadrículas están en el mismo esquema de grillado! Es un poco más complejo si no lo son ...

import numpy as np 

# Generate grids of coordinates from a min, max, and spacing 
dx, dy = 0.5, 0.5 

# For the larger grid... 
Axmin, Axmax = -180, 180 
Aymin, Aymax = -90, 90 

# For the smaller grid... 
Bxmin, Bxmax = -5, 10 
Bymin, Bymax = 30, 40 

# Generate the indicies on a 2D grid 
Ax = np.arange(Axmin, Axmax+dx, dx) 
Ay = np.arange(Aymin, Aymax+dy, dy) 
Ax, Ay = np.meshgrid(Ax, Ay) 

Bx = np.arange(Bxmin, Bxmax+dx, dx) 
By = np.arange(Bymin, Bymax+dy, dy) 
Bx, By = np.meshgrid(Bx, By) 

# Find the corner of where the two grids overlap... 
ix, iy = np.argwhere((Ax == Bxmin) & (Ay == Bymin))[0] 

# Assert that the coordinates are identical. 
assert np.all(Ax[ix:ix+Bx.shape[0], iy:iy+Bx.shape[1]] == Bx) 
assert np.all(Ay[ix:ix+Bx.shape[0], iy:iy+Bx.shape[1]] == By) 
+0

¡Oh, eso es simple! ¡Gracias! – BernardShaw

0

¿Puedes decir algo más? ¿Qué modelo estás usando? ¿Qué estás modelando? ¿Cómo se calcula?

¿Se puede hacer que las dimensiones coincidan para evitar el ajuste? (es decir, si B no depende de A, solo conecte la parte de A que modelos B, o calcule valores aburridos para las partes de B que no se superpondrían A y suelte esos valores más adelante)

+0

Es un modelo climático global. "A" almacena cuántas velocidades en cada celda de la cuadrícula se han girado (por la razón que sea), y "B" son las velocidades reales. El tamaño y la ubicación de las matrices son las mismas para todos mis análisis, así que solo necesito resolver la superposición una vez. Como he mencionado, lo resolví en una especie de fuerza bruta, que funciona para lo que tengo que hacer. Entonces, en este punto, se trata más bien de un ejercicio intelectual abstracto: ¿cómo se puede averiguar dónde una cuadrícula, siendo una porción de otra, se superpone con la original? – BernardShaw

0

Necesito encontrar los índices en los que comienzan a superponerse

¿Está buscando índices de A o de B? Y es B estrictamente rectangular?

Encontrar el cuadro delimitador o el casco convexo de B es realmente económico.

Cuestiones relacionadas