无需循环实现NumPy矩阵行内滑动三元素累加计算
无循环实现NumPy矩阵滑动三元素求和(保留首尾)
给定原矩阵:
import numpy as np B = np.array([[1, 1, 2, 3, 3], [4, 4, 5, 6, 6], [7, 7, 8, 9, 9]])
期望得到的结果矩阵:
result = np.array([[1, 4, 6, 8, 3], [4, 13, 15, 17, 6], [7, 22, 24, 26, 9]])
需求说明:保留每行首尾元素,中间每个元素为原矩阵对应位置相邻三个元素的和(即result[i,j] = B[i,j-1] + B[i,j] + B[i,j+1],其中1<=j<=3)。
无循环优化实现方案
直接利用NumPy的向量化切片操作,完全避免循环,代码简洁且高效:
# 初始化结果矩阵,复制原矩阵的所有元素 result = B.copy() # 计算中间列的滑动三元素和:将原矩阵的三列切片相加 result[:, 1:-1] = B[:, :-2] + B[:, 1:-1] + B[:, 2:]
原理说明
B[:, :-2]:取原矩阵所有行,列范围是从第0列到倒数第3列(即列索引0、1、2)B[:, 1:-1]:取原矩阵所有行,列范围是从第1列到倒数第2列(即列索引1、2、3)B[:, 2:]:取原矩阵所有行,列范围是从第2列到最后一列(即列索引2、3、4)- 这三个数组相加后,刚好对应结果矩阵中间列(列索引1、2、3)的每个元素,即原矩阵对应位置相邻三个元素的和。
这种方法完全依赖NumPy的底层向量化运算,比循环实现的效率高得多,尤其适合处理大规模矩阵。
内容的提问来源于stack exchange,提问作者Iphy Kelvin
相关产品推荐
相关产品推荐

