gpt4 book ai didi

python - 确定给定点半径内网格值平均值的最快方法

转载 作者:行者123 更新时间:2023-12-01 05:02:50 24 4
gpt4 key购买 nike

我有一个 numpy 2D 值数组。数组中的每个元素代表网格中的一个网格点,其中每个框的边长为 13 公里。我需要确定网格上特定点 50 英里范围内所有点的平均值。

我当前的解决方案确定一个边界框,然后使用其索引引用该框中数组中的项目,这对于 numpy 来说很慢。我正在尝试确定更快的解决方案。

当前解决方案:

num_x = 400        #horizontal dimension of the 2D array
num_y = 300 #vertical dimension of the 2D array
num_dx = 6 #maximum number of horizontal grid points that fit within 50 miles
num_dy = 6 #same as above but for vertical (square grid)
radius_m = 80467.2 #50 miles expressed in meters
values = [] # stores the extracted values

for ix in range(-num_dx,num_dx+1):
for jy in range(-num_dy,num_dy+1):
# Determine distance to this point
dist = ((ix*dx)**2+(jy*dy)**2)**0.5
if dist <= radius_m:
# Ensure this grid point actually exists within the grid
if (j+jy) < num_y and (i+ix) < num_x:
value = myarray[i+ix,j+jy]
if value is not masked and value >= 0:
values.append(float(value))

average = sum(values) / float(len(values))

由于要提取单个元素的值而访问 myarray 超过 100 次,因此速度很慢(大约需要 1.5 秒)。有没有一种矢量方法在这里效果更好?我似乎无法找到一种方法来使用掩码来做到这一点,因为条件是基于网格点相对于另一个网格点的位置,而不是元素本身的值。

最佳答案

您的代码无法运行,并且似乎包含以下错误:i < num_dxj < num_dy (然后它环绕到数组的另一侧)。但是对变量名称做出一些假设,这就是我的做法:

# First make sure we stay in the grid
i1, i2 = max(i-num_dx, 0), min(i+num_dx+1, num_x)
j1, j2 = max(j-num_dy, 0), min(j+num_dy+1, num_y)

# Get the radius in blocks, grid should be homogeneous
radius_i = radius_m / 13000.0

# Calc distances per element by broadcasting
DX = np.arange(i1, i2) - i
DY = np.arange(j1, j2)[:, None] - j
mask = DX*DX + DY*DY <= radius_i*radius_i

# Get block of interest and apply mask
values = myarray[i1:i2, j1:j2][mask]

关于python - 确定给定点半径内网格值平均值的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25690729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com