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 简单地解决它,但它很慢。有人有更好的想法吗?

4

3 回答 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) 
于 2010-11-16T17:36:35.250 回答
0

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

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

于 2010-11-11T04:41:09.893 回答
0

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

那么您是在寻找来自 A 还是来自 B 的索引?B 是严格矩形的吗?

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

于 2010-11-16T07:11:27.210 回答