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阵列,而不是随机的二维散射点
我有另一种方法使用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)
结果显示如下:- 使用插值粗化数据时是否存在一些问题李>
是否有一些有用的函数,我可以按位置(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))