当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何更粗糙的二维阵列数据分辨率》经验,为你挑选了1个好方法。

我在这里有类似的问题
这个问题与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散点.

添加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> Praveen..:

如果我理解正确的话,你可以通过聚合每个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))

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有