如何无循环将偶数维度Numpy数组维度减半
无循环实现Numpy偶数维度数组的块平均降维
需求说明
要把偶数维度的Numpy数组(比如4×4转2×2、500×500转250×250),按每2×2块取平均值的方式压缩维度,要求不用循环,且能适配所有偶数维度的数组。
问题分析
你手动选取四个块计算的写法不仅冗余,还容易出错(比如你给出的实际输出明显是没正确执行除法导致的),而且没法直接适配更大的数组。
解决方案
用Numpy的reshape和mean组合就能搞定,完全不需要循环,代码通用所有偶数维度:
import numpy as np # 输入示例数组 x_4 = np.array([[1, 2, 4, 5], [3, 4, 6, 8], [5, 3, 1, -1], [2, 3, 5, 0]]) # 核心逻辑 block_size = 2 # 500×500数组的话,这里改成250就行 # 先把数组拆成四维分块结构,再对每个块内部的元素求平均 result = x_4.reshape( x_4.shape[0] // block_size, block_size, x_4.shape[1] // block_size, block_size ).mean(axis=(1, 3)) print(result) # 输出符合预期: # [[2.5 5.75] # [3.25 1.25]]
原理解释
reshape操作把原数组拆成了(块行数, 块内行数, 块列数, 块内列数)的四维结构,比如4×4数组会变成(2,2,2,2),对应2行2列共4个2×2的块。mean(axis=(1,3))是对每个块内部的行、列维度求平均,直接得到每个块的平均值,最终输出维度就是原维度的一半。- 不管是4×4还是500×500,只要把
block_size设为原维度的一半,代码就能直接用,完全不用改其他地方。
内容的提问来源于stack exchange,提问作者zay_117
相关产品推荐
相关产品推荐

