Python 如何粗化二维阵列数据分辨率

Python 如何粗化二维阵列数据分辨率,python,arrays,numpy,matplotlib,Python,Arrays,Numpy,Matplotlib,我有一个类似的问题 这个问题是关于tiff数据的,我想找到一种更通用的方法来处理它 我的问题 例如: 形状为200x150的二维numpy阵列表示1km x 1km分辨率的人口密度数据 我的目标:更改空间分辨率=>5 km x 5 km分辨率 这是一个随机分布的数据集群进入网格网络的示例图 *红点:原始数据 *蓝点:网格网络表示二维阵列 *绿色圆圈:为每个红点找到最近的蓝点并求和。 *在这个问题中,区别在于原始数据也是二维numpy数组 我的解决方案 与我的另一个问题类似,我将二维

我有一个类似的问题
这个问题是关于tiff数据的,我想找到一种更通用的方法来处理它

我的问题 例如:

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

  • 我的目标:更改空间分辨率=>5 km x 5 km分辨率
这是一个随机分布的数据集群进入网格网络的示例图
*红点:原始数据
*蓝点:网格网络表示二维阵列 *绿色圆圈:为每个红点找到最近的蓝点并求和。
*在这个问题中,区别在于原始数据也是二维numpy数组

我的解决方案
  • 与我的另一个问题类似,我将二维散射点聚类到最近的网格点。我感谢@HYRY支持的答案,它大大改进了我的代码

  • 在这个问题中,我使用KD树算法来寻找每个原始点数据最近的网络节点。结果显示:

  • 我认为一定有更简单的方法来重塑结构化的二维numpy阵列,而不是随机的二维散射点

添加2016-01-09 感谢@Praveen的回答。
我有另一种方法使用scipy插值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)
结果显示如下:

  • 使用插值粗化数据时是否存在一些问题
加2
是否有一些有用的函数,我可以按位置(x,y)从原始阵列数据集中采样一些数据?

如果我理解正确,您有一个非常精细的总体密度图,您正试图通过将每个5x5像素区域内的总体密度聚集在一起来进行粗略计算。是这样吗

所以当你说你要把1km x 1km变成5km x 5km时,你的意思是每个像素当前代表1km x 1km区域的人口,而你想让它代表5km x 5km区域的人口

如果是这样,请不要使用集群和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
的形状是
粗糙度的精确倍数时,这才有效。我相信这是你的情况,因为你说你有一个200x150的图像,你试图使粗糙的一个因素5

对于不是粗糙度因子倍数的图像
所以你想要图像?我不想提取数据的子集。我认为这更像是在不丢失信息的情况下重新采样数据。我会在我的问题中解释更多。你应该单独问你的插入问题。如果一个问题不断变化,很难回答。谢谢你的回答。谢谢!因此,当原始形状不符合粗糙度因子时,不能使用此方法?您将无法以如此简洁的方式进行此操作。您必须单独处理边缘案例。我想我可能会通过零填充来实现。我会在一分钟内修改答案。@AlecMcGail我认为如果原始形状可以被粗糙度因子整除,那么你可能会选择
np.mean
而不是
np.sum
,你应该很好(假设你是按面积平均的)。如果不是这样,您就必须对边缘情况做一些不同的处理,因为零填充将影响平均值。四年后见到你很惊讶哈哈!
# 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))