两个二维数组何时开始重叠?

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
这个问题的答案取决于你所拥有的网格类型。它是等间距笛卡尔网格吗? - Sven Marnach
1
A和B的网格点位置的坐标是水平和垂直都是升序的吗?如果是的话,只需要进行一些二分搜索即可。 - Justin Peel
如果这是一张全球气候地图,B是否对应于像非洲这样的地理区域(即形状不完全为矩形的区域),还是仅仅是一个矩形子区域? - Jordan Reiter
3个回答

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) 

0
你能多说一些吗?你正在使用哪种模型?你在建模什么?它是如何计算的?
你能让尺寸匹配以避免装配问题吗?(即,如果B不依赖于A的所有部分,只需将B所代表的那部分A插入,或者为B的那些不会重叠A的部分计算无聊的值,并稍后舍弃那些值)

这是一个全球气候模型。 "A" 存储了每个网格单元的速度旋转量(出于任何原因),而 "B" 是实际速度。所有分析的数组大小和位置都相同,因此我只需要找出重叠部分一次即可。正如我所暗示的,我用一种类似于蛮力的方法解决了这个问题,这对我需要做的事情有效。因此,现在它更像是一种抽象的智力锻炼:如何确定一个网格(作为另一个网格的切片)重叠原始网格的位置? - BernardShaw

0
我需要找到它们开始重叠的索引位置。
你是在寻找A或B的索引?B是否严格为矩形?
查找B的边界框或凸包非常简单。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接