我有一个numpy的二维数组值。数组中的每个元素表示一个网格中的一个网格点,每个网格的边长为13km。我需要确定网格上特定点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))
这是缓慢(约需1.5秒)由于访问myarray中超过100倍,以提取一个单一的元素的值。有没有一种矢量方法可以在这里更好地工作?我似乎无法找出一种方法来使用掩码,因为条件是基于网格点相对于另一个的位置,而不是元素本身的值。
你为什么不切片数组? – 2014-09-05 17:21:27
我不确定你的意思。你能提供一个例子吗? – TheOx 2014-09-05 18:40:55
这样想:对于圆上的每个点,还有3个其他点的大小完全相同,但组件上的符号不同。 – 2014-09-05 18:48:45