如何仅用Numpy函数无循环计算二维数组元素与左上相邻元素的和
实现方案
通过对原数组做偏移补零后逐元素叠加即可实现,全程无Python层面的显式循环,所有运算由numpy底层向量化执行,性能优异。
完整代码
import numpy as np Q = np.asarray([ [0.20, 0. , 0.3 , 0.1 ], [0.10, 0. , 0.2 , 0. ], [0.05, 0. , 0. , 0. ], [0. , 0. , 0. , 0.05], ], dtype=float) # 原数组向下偏移1行,首行补0,对应每个位置的上方元素 pad_top = np.pad(Q, ((1, 0), (0, 0)), mode='constant')[:-1, :] # 原数组向右偏移1列,首列补0,对应每个位置的左侧元素 pad_left = np.pad(Q, ((0, 0), (1, 0)), mode='constant')[:, :-1] # 原数组向右下偏移1行1列,首行首列补0,对应每个位置的左上角元素 pad_top_left = np.pad(Q, ((1, 0), (1, 0)), mode='constant')[:-1, :-1] # 自身+上方+左侧+左上角 求和得到结果 J = Q + pad_top + pad_left + pad_top_left
结果说明
上述代码输出的J与你给出的预期结果完全一致:
array([[0.2 , 0.2 , 0.3 , 0.4 ], [0.3 , 0.3 , 0.5 , 0.6 ], [0.15, 0.15, 0.2 , 0.2 ], [0.05, 0.05, 0. , 0.05]])
实现逻辑是将不存在的相邻元素默认按0处理,通过np.pad补零加切片操作完成数组偏移,最后直接逐元素相加,适配任意尺寸的输入数组。
内容的提问来源于stack exchange,提问作者TheDemonTelevision
相关产品推荐
相关产品推荐

