我有一个类似的问题here
这个问题与tiff数据类似,我想找到一种更普遍的方法来处理它。
例如:
http://i4.tietuku.com/060fe38e9ccf6daf.png
这是随机分布式数据集群到网格网络的示例图片 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散点。
感谢@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)从原始数组数据集中采样一些数据?
答案 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}}