我在这里有类似的问题
这个问题与tiff数据类似,我想找到一种更通用的方法来处理它.
例如:
形状为200x150的2维numpy阵列表示1 km x 1 km分辨率的人口密度数据.
http://i4.tietuku.com/060fe38e9ccf6daf.png
我的目标:改变空间分辨率=> 5 km x 5 km分辨率
这是随机分布式数据集群到网格网络的示例图片 http://i4.tietuku.com/a4c1355413f8cdbc.png
*红点:原始数据
*蓝点:网格表示二维数组*绿色圆圈:找到每个红点最近的蓝点并求它们.
*在这个问题中,区别在于原始数据也是2-d numpy数组.
与我在这里的另一个问题类似,我将2-d散点指向最近的网格点.我很欣赏@HYRY支持的答案,它改进了我的代码.
在那个问题中,我使用KD树算法来查找每个原始点数据的最近网络节点.结果显示在这里:http:
//i4.tietuku.com/1a420c48ed7bcb1c.png
我认为必须有一些更简单的方法来重塑结构化的2-d numpy数组而不是随机的2-d散点.
感谢@Praveen的回答.
我有另一种使用scipy interpolate 2d函数的方法.
这是我的代码:
xi = np.linspace(x_map1,x_map2,pop.shape[1]) yi = np.linspace(y_map1,y_map2,pop.shape[0]) hfunc = interpolate.interp2d(xi,yi,pop) x_grid = np.linspace(x_map1,x_map2,new_shape_x) y_grid = np.linspace(y_map1,y_map2,new_shape_y) new_pop = np.zeros(new_shape_x * new_shape_y) t = 0 for i in range(0,new_shape_y,1): for j in range(0,new_shape_y,1): new_pop[t] = hfunc(x_grid[j],y_grid[i]) t+=1 new_pop = new_pop.reshape(new_shape_y,new_shape_x) plt.pcolormesh(new_pop)
结果显示如下:http:
//i4.tietuku.com/b020db6dc2d75d70.png
当我使用插值来粗化数据时是否存在一些问题?
是否有一些有用的功能,我可以按位置(x,y)从原始数组数据集中采样一些数据?
如果我理解正确的话,你可以通过聚合每个5x5像素区域内的人口密度来获得非常精细的人口密度图,这是你试图做的粗略的.是对的吗?
因此,当你说你试图将1公里x 1公里变成5公里x 5公里时,你的意思是每个像素目前代表1公里x 1公里区域内的人口,而你想让它代表5公里x 5公里区域内的人口.
如果是这样,请不要使用群集和KD树!这将是一种非常低效的方式来做更简单的事情.
这可能就是你想要的.解释:
# Suppose the 2D array is pop_density coarseness = 5 temp = pop_density.reshape((pop_density.shape[0] // coarseness, coarseness, pop_density.shape[1] // coarseness, coarseness)) coarse_pop_density = np.sum(temp, axis=(1,3))
如在另一个答案中所述,这只有在形状pop_density
的精确倍数时才有效coarseness
.我相信你就是这种情况,因为你说你有一张200x150的图像,你试图使图像变粗5倍.
# Suppose the size of pop_density was 198x147 instead of 200x150. # Start by finding the next highest multiple of 5x5 shape = np.array(pop_density.shape, dtype=float) new_shape = coarseness * np.ceil(shape / coarseness).astype(int) # new_shape is now (200, 150) # Create the zero-padded array and assign it with the old density zp_pop_density = np.zeros(new_shape) zp_pop_density[:shape[0], :shape[1]] = pop_density # Now use the same method as before temp = zp_pop_density.reshape((new_shape[0] // coarseness, coarseness, new_shape[1] // coarseness, coarseness)) coarse_pop_density = np.sum(temp, axis=(1,3))