如何在Python中同时沿x、y两个方向(对角方向)平移2D方阵?
2D方阵对角平移Python实现方案
效果参考示意图:
对角平移本质是同时对矩阵的行(y方向)和列(x方向)做指定步长的循环移位,Python中可以通过两种常见方式实现:
方案1:使用numpy实现(性能最优,推荐)
直接调用numpy内置的roll函数即可完成,提前安装依赖:pip install numpy
实现代码:
import numpy as np def diagonal_shift(matrix, dx: int, dy: int): """ 2D方阵对角平移 :param matrix: 输入2D numpy方阵 :param dx: x方向平移步长,正数右移,负数左移 :param dy: y方向平移步长,正数下移,负数上移 :return: 平移后方阵 """ # 沿x方向(列维度,轴1)移位 res = np.roll(matrix, shift=dx, axis=1) # 沿y方向(行维度,轴0)移位 res = np.roll(res, shift=dy, axis=0) return res # 测试示例 if __name__ == "__main__": test_mat = np.arange(16).reshape(4,4) print("原始矩阵:\n", test_mat) # 右下方向各平移1步 shifted = diagonal_shift(test_mat, dx=1, dy=1) print("\n平移后矩阵:\n", shifted)
方案2:纯Python列表实现(无第三方依赖)
如果不想引入numpy依赖,也可以基于列表切片实现:
def diagonal_shift_pure_python(matrix: list[list], dx: int, dy: int): n = len(matrix) # 处理步长取模,避免超过矩阵尺寸 dx = dx % n dy = dy % n # 先完成列方向平移 col_shifted = [row[-dx:] + row[:-dx] if dx != 0 else row.copy() for row in matrix] # 再完成行方向平移 row_shifted = col_shifted[-dy:] + col_shifted[:-dy] if dy != 0 else col_shifted return row_shifted
两种实现均支持任意步长的对角平移,超出矩阵边界的元素会自动循环补到对侧,和示意图效果完全一致。
内容的提问来源于stack exchange,提问作者Skylimit
相关产品推荐
相关产品推荐

