如何更粗糙的二维阵列数据分辨率

时间:2016-01-09 03:58:53

标签: python arrays numpy matplotlib

我有一个类似的问题here
这个问题与tiff数据类似,我想找到一种更普遍的方法来处理它。

我的问题

例如:

  • 形状为200x150的2-d numpy阵列表示1 km x 1 km分辨率的人口密度数据。

http://i4.tietuku.com/060fe38e9ccf6daf.png

  • 我的目标:更改空间分辨率=> 5公里x 5公里分辨率
  

这是随机分布式数据集群到网格网络的示例图片   http://i4.tietuku.com/a4c1355413f8cdbc.png
  *红点:原始数据
  *蓝点:网格表示二维数组   *绿色圆圈:找到每个红点最近的蓝点并将它们相加   *在这个问题中,区别在于原始数据也是2-d numpy数组。

我的解决方案

  • 与我的另一个问题here类似,我将2-d散点图聚类到最近的网格点。我很欣赏@HYRY支持的答案,它改进了我的代码。

  • 在该问题中,我使用KD树算法查找每个原始点数据的最近网络节点。结果显示在这里:
    http://i4.tietuku.com/1a420c48ed7bcb1c.png

  • 我认为必须有一些更简单的方法来重塑结构化的2-d numpy数组,而不是随机的2-d散点。

添加2016-01-09

感谢@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

  • 当我使用插值来粗化数据时是否存在一些问题?

添加2

是否有一些有用的功能我可以按位置(x,y)从原始数组数据集中采样一些数据?

1 个答案:

答案 0 :(得分:5)

如果我理解正确的话,你可以通过聚合每个5x5像素区域内的人口密度来获得一个非常精细的人口密度图,这是你试图做出的。是吗?

所以当你说你试图将1公里x 1公里变成5公里x 5公里时,你的意思是每个像素目前代表1公里x 1公里区域内的人口,而你想要制作它代表5公里x5公里区域内的人口。

如果是这样,请不要使用群集和KD树!这将是一种非常低效的方式来做更简单的事情。

This可能就是你想要的。解释:

pop_density

正如其他答案所述,只有coarseness的形状是# 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)) 的精确倍数时才会有效。我相信你就是这种情况,因为你说你有一张200x150的图像,你试图将图像缩小到5倍。

对于不是粗糙度因子的倍数的图像

{{1}}