两个2-D阵列在哪里开始相互重叠?

时间:2010-11-11 02:26:23

标签: python multidimensional-array numpy subdomain overlap

我正在使用模型输出,我似乎无法想出一种结合两个数据数组的好方法。数组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来解决它,但它很慢。谁有更好的想法?

3 个答案:

答案 0 :(得分:1)

  

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

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

两个网格是否严格遵循相同的网格方案?假设它们是,你可以做类似的事情:

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

假设两个网格的世界坐标在与网格的指标相同的方向上增加,则给出子集网格的左下角。 (如果它们没有朝同一方向增加(即负dxdy),它只会给出其他角落之一)

在下面的示例中,我们显然可以从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) 

答案 1 :(得分:0)

你能说更多吗?你用的是什么型号的?你在做什么造型?它是如何计算的?

您可以使尺寸匹配以避免合身吗? (即如果B不依赖于所有的A,只插入B模型的A部分,或计算B部分不会重叠A并且稍后丢弃这些值的无聊值)

答案 2 :(得分:0)

  

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

那你在寻找A或B的索引吗? B是严格的矩形吗?

找到B的边界框或凸包非常便宜。