两个二维数组从何处重叠?
我现在在处理模型输出的数据,想把两个数据数组合并在一起,但总是找不到好的方法。数组A和B存储了不同的数据,每个数组中的数据项对应某个空间位置(x,y)点——A存的是某个参数,而B存的是模型的输出。问题是,B只是A的一个空间子集,也就是说,如果模型是针对整个世界的,A会在地球上的每个点存储参数,而B只会存储非洲那些点的模型输出。
所以我需要找出B相对于A的偏移量——换句话说,我需要找出它们开始重叠的索引。如果A的形状是(1000,1500),那么B是(750:850, 200:300)这一部分,还是(783:835, 427:440)这一部分呢?我有与A和B相关的数组,存储了每个网格点的(x,y)位置。
这看起来是个简单的问题——找出这两个数组的重叠部分。我可以用scipy.spatial的KDTree来解决这个问题,但速度很慢。有没有人有更好的主意?
3 个回答
你能多说一点吗?你在用什么模型?你在建模什么?这个是怎么计算的?
你能让尺寸匹配一下,避免不合适吗?(也就是说,如果B并不依赖于A的全部,只需要用A中B所需要的那部分,或者计算一些无关紧要的值,然后把那些不重叠的B的值丢掉)
我需要找出它们开始重叠的索引位置。
那么你是想找A的索引还是B的索引呢?还有,B是严格的矩形吗?
找到B的边界框或者凸包其实很简单。
我有两个数组,分别与A和B相关,它们存储了每个网格点的(x,y)位置。
在这种情况下,答案应该比较简单……
这两个网格的划分方式是完全一样的吗?假设它们是一样的,你可以这样做:
np.argwhere((Ax == Bx.min()) & (Ay == By.min()))
假设这两个网格的世界坐标是沿着网格的索引方向增加的,这样就能得到子网格的左下角位置。(如果它们的坐标不是同方向增加的,比如说有负的dx
或dy
,那么就会得到其他角落的位置)
在下面的例子中,我们当然可以直接通过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)