如何使用Numpy计算二维数组按指定块大小划分的各分块平均值
Numpy二维数组按指定尺寸分块求均值实现
已知条件
给定如下Numpy数组和分块参数:
import numpy as np temp_array = np.array( [[33.5, 35.3, 33.6, 33.6, 33.5, 33.9, 32.3, 33.2, 53.8, 54.6, 53.4, 54.2], [33.1, 34.2, 34.1, 34.3, 34.7, 31.3, 32.3, 33.4, 57.5, 55. , 53.5, 56.1], [35.3, 35.4, 35.6, 32.6, 33.2, 34.3, 32.8, 33.1, 54.7, 55.4, 54.6, 55.1], [34.2, 36.1, 33.5, 32.4, 32.1, 33.5, 34.5, 35. , 53.8, 56.9, 54.5, 54.7], [33.4, 33.8, 36.2, 33. , 35. , 34.2, 33.8, 33.8, 55.7, 55.2, 56. , 54.5], [34.3, 35.9, 34.4, 34.2, 53.5, 54.2, 55.7, 54. , 56.3, 54.4, 55.5, 53.8], [34.7, 35.4, 34.7, 33.1, 53.6, 54.5, 54.4, 55.5, 54.7, 55.4, 55.1, 55.6], [33.3, 34.3, 33.6, 33.1, 55.4, 55.7, 55.4, 55.4, 55.8, 55. , 55.3, 54.1], [33.7, 33.5, 37. , 34.9, 57.6, 54.2, 54.9, 54.6, 56. , 55.7, 55.1, 55.9], [34. , 35.1, 33.6, 34.5, 56.2, 55.3, 55.2, 54. , 54.1, 54.5, 54.4, 56. ]]) cell_shape = (5,4)
需求是按cell_shape尺寸将数组划分为连续不重叠的子区块,计算每个子区块所有元素的平均值。
实现代码
利用Numpy维度变换和轴均值计算即可高效实现,无需循环遍历:
# 计算分块数量 row_block_num = temp_array.shape[0] // cell_shape[0] col_block_num = temp_array.shape[1] // cell_shape[1] # 维度重塑后调整轴顺序,对每个子块的最后两个维度求平均 block_avg = temp_array.reshape(row_block_num, cell_shape[0], col_block_num, cell_shape[1])\ .transpose(0,2,1,3)\ .mean(axis=(-2,-1))
输出结果
运行后得到6个分块的平均值为:
array([[34.035, 33.44 , 55.02 ], [34.28 , 54.94 , 55.11 ]])
如果需要展开为一维列表,可直接调用block_avg.flatten()得到:[34.035, 33.44, 55.02, 34.28, 54.94, 55.11]
内容的提问来源于stack exchange,提问作者Fahad Rahman
相关产品推荐
相关产品推荐

