关键词:最大值,最小值,重采样,numpy,切片,np.where,python
分辨率为10m的遥感影像读出的数组origin_arr的性状为9×9,如何通过不遍历的方式将其重采样为30m分辨率,形状为3×3的数组target_arr呢?
结果数组中每个数都是原数组对应区域的最大值,例如:9是(2,5,1,9,3,3,9,0,4)中的最大值,即结果数组中的一个格子对应原来数组的9个格子。
在python中,可以利用numpy的切片取出9个格子的左上位置,left_up_arr = origin_arr[0:9:3, 0:9:3],结果为:
同理,可以取出另外8个位置:
正上方位置 center_up_arr = origin_arr[0:9:3, 1:9:3]
右上方位置 right_up_arr = origin_arr[0:9:3, 2:9:3]
左边位置 left_center_arr = origin_arr[1:9:3, 0:9:3]
正中位置 center_arr = origin_arr[1:9:3, 1:9:3]
右边位置 right_center_arr = origin_arr[1:9:3, 2:9:3]
左下方位置 left_bottom_arr = origin_arr[2:9:3, 0:9:3]
正下方位置 center_bottom_arr = origin_arr[2:9:3, 1:9:3]
右下方位置 right_bottom_arr = origin_arr[2:9:3, 2:9:3]
上面这些数组大小与target_arr形状相同。
对于最大值重采样:在函数的最开始创建一个值足够小,大小与结果数组大小相同的数组,在本例中,创建大小为3×3,值为0的数组。
通过np.where函数逐次进行条件赋值,最终得到结果数组。
对于最小值重采样:应在函数的最开始创建一个值足够大,大小与结果数组大小相同的数组,在本例中,创建大小为3×3,值为10的数组。
整理后完成代码,完整最值重采样函数如下:
def lessen_scale(origin_arr, r1, r2, mode='max'): """ 把h1行w1列的分辨率为r1矩阵重采样为h2行w2列的分辨率为r2矩阵 :return:返回结果矩阵 """ h1, w1 = np.shape(origin_arr) scale = int(r2 / r1) h2 = int(h1 * r1 / r2) w2 = int(w1 * r1 / r2) if mode == 'max': target_arr = np.zeros((h2, w2)) for i in range(scale): for j in range(scale): max_arr = origin_arr[i:h2*scale:scale, j:w2*scale:scale] target_arr = np.where(max_arr >= target_arr, max_arr, target_arr) return target_arr, h2, w2 elif mode == 'min': target_arr = np.zeros((h2, w2)) target_arr[target_arr == 0] = 10 for i in range(scale): for j in range(scale): min_arr = origin_arr[i:h2*scale:scale, j:w2*scale:scale] target_arr = np.where(min_arr <= target_arr, min_arr, target_arr) return target_arr, h2, w2