2010-11-11 121 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)位置。

这似乎是一个简单的问题 - 找到两个阵列重叠的地方。我可以用scipy.spatial的KDTree来解决它,但它非常缓慢。任何人有更好的想法?

+1

这个问题的答案真的取决于你有的网格类型。它是一个等距的笛卡尔网格吗? – 2010-11-11 09:07:02

+1

对于A和B的网格点的位置,坐标是否在水平和垂直方向上升?如果是这样,那么只需做一些二进制搜索。 – 2010-11-13 03:57:42

+0

如果这是全球气候图,B是否与非洲等地理区域相对应(即形状不完全是矩形)还是只是一个矩形子区域? – 2010-11-22 19:40:45

回答

1

我有阵列与A和B相关联,它们存储每个网格点的(x,y)位置。

在这种情况下,答案应该是相当简单的...

是两个网格严格在同一网格化方案?假如是这样,你可以这样做:

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

假设两个网格的世界坐标增加在相同的方向网格的indicies,这给子集化的网格的左下角。 (如果他们没有在同一方向(即负dxdy)增加,它只是给对方一个角)

在下面的例子中,我们可以明显才算从ix = (Bxmin - Axmin)/dx等适当indicies ,但假设你有一个更复杂的网格系统,这仍然有效。但是,这是假定两个网格处于相同的网格方案!它稍微复杂,如果他们不...

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 2010-11-28 23:11:29

0

你能说更多吗?你使用什么模型?你在建模什么?它是如何计算的?

你可以使尺寸匹配,以避免适合? (即,如果B不依赖于A的全部,则只插入A模型的B部分,或者计算B不会与A重叠并且稍后丢弃这些值的部分的钻孔值)

+0

这是一个全球气候模型。 “A”存储每个网格单元的速度已经旋转了多少(无论出于何种原因),“B”是实际速度。数组的大小和位置对于我的所有分析都是相同的,所以我只需要确定一次重叠。正如我提到的那样,我以一种强力的方式解决了这个问题,这对我需要做的事情起作用。所以在这一点上,它更多的是一个抽象的智力练习:如何计算一个网格作为另一个网格与原始网格重叠的位置? – BernardShaw 2010-11-11 04:46:56

0

我需要找到他们开始重叠的索引

那么你是从A还是从B寻找索引? B是严格矩形的吗?

找到B的边界框或凸包真的很便宜。