2010-11-11 3 views
6

Я работаю с выходом модели в данный момент, и я не могу придумать хороший способ комбинирования двух массивов данных. Массивы A и B хранят разные данные, а записи в каждом соответствуют некоторой пространственной (x, y) точке - A содержит некоторый параметр, а B - выход модели. Проблема в том, что B является пространственным подразделением A, т.е. если модель была для всего мира, A сохранит параметр в каждой точке земли, а B сохранит модельный вывод только для тех точек в Африке ,Где два двухмерных массива начинают перекрывать друг друга?

Так что мне нужно найти, сколько B смещено от A - по-другому, мне нужно найти индексы, с которых они начинают перекрываться. Таким образом, если A.shape = (1000,1500), B является частью (750: 850, 200: 300) этого или подразделением (783: 835, 427: 440)? У меня есть массивы, ассоциированные с A и B, которые сохраняют (x, y) позиции точек сетки для каждого.

Это может показаться простой проблемой - найти, где два массива перекрываются. И я могу решить его с помощью KDTree scipy.spatial достаточно просто, но это очень медленно. У кого-нибудь есть лучшие идеи?

+1

Ответ на этот вопрос действительно зависит от типа используемой сетки. Является ли это декартовой сеткой с равномерным распределением? –

+1

Являются ли координаты возрастающими как по горизонтали, так и по вертикали для позиций точек сетки A и B? Если да, то просто выполните несколько бинарных поисков. –

+0

Если это глобальная климатическая карта, соответствует ли B географическому региону, например, Африке (т. Е. Что-то, что не было бы точно прямоугольной по форме), или это просто прямоугольный подраздел? –

ответ

1

У меня есть массивы, связанные как с A, так и с B, которые хранят (x, y) позиции точек сетки для каждого.

В этом случае ответ должен быть достаточно простой ...

ли две сетки строго по той же схеме гридинга? Предполагая, что они есть, вы можете просто сделать что-то вроде:

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

Если предположить, что в мире координаты двух сетках увеличиваются в том же направлении, что и indicies решеток, это дает нижний левый угол subsetted сетки. (А если они не растут в том же направлении (т.е. отрицательного dx или dy), он просто дает один из других углов)

В приведенном ниже примере, мы могли бы, очевидно, просто вычислить соответствующее indicies из ix = (Bxmin - Axmin)/dx, и т.д. , но при условии, что у вас более сложная система грида, это все равно будет работать. Однако это предполагает, что две сетки находятся на одной и той же схеме сетки! Это немного сложнее, если они не ...

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

О, это просто! Благодаря! – BernardShaw

0

Можете ли вы сказать больше? Какую модель вы используете? Что вы моделируете? Как он вычисляется?

Можете ли вы согласовать размеры, чтобы избежать соответствия? (т. е. если B не зависит от всех A, только подключите часть A к этим моделям B или вычислите значения расточки для частей B, которые не перекрывали бы A и не уменьшали бы эти значения позже)

+0

Это глобальная климатическая модель. «A» хранит, сколько скоростей в каждой ячейке сетки было повернуто (по какой-либо причине), а «B» - фактические скорости. Размер и расположение массивов одинаковы для всего моего анализа, поэтому мне действительно нужно только разобрать перекрытие. Как я уже упоминал, я решил это в какой-то грубой форме, которая работает для того, что мне нужно делать. Итак, на данный момент это более абстрактное интеллектуальное упражнение: как определить, где одна сетка, будучи срезом другого, перекрывает оригинал? – BernardShaw

0

Мне нужно найти индексы, в которых они начинают перекрываться

Итак, вы ищете индексы от A или от B? И B строго прямоугольный?

Нахождение ограничительной рамки или выпуклого корпуса B действительно дешево.

Смежные вопросы