此为Z字型扫描的基本示例python代码
Z字型扫描共有 4 种行动方式:向右、向左下、向下、向右上,循环往复直至对一个二维矩阵扫描完毕。
为实现此 4 种功能,为此配置不同的函数进行执行。
trun函数:若触及四边的边界,进行扫描方向的转变
move_left_down()函数:一直向左下扫描,直至抵达左边界或底部
move_right_up()函数:一直向右上扫描,直至抵达右边界或顶部
完整代码如次下:
import numpy as np
def turn(row, column, rows,cols):
if row == rows - 1: # 已到达底部,此时需向右移动 (即,行数row不变,列数col右移)
column += 1
elif column == cols - 1: # 已到达右边界,此时需向下移动 (即,行数row下移,列数col不变)
row += 1
elif row == 0: # 已到达顶部(须放在‘已到达右边界’之后) (即,行数row不变,列数col右移)
column += 1
elif column == 0: # 已到达左边界(须放在‘已到达底部’之后) (即,行数row下移,列数col不变)
row += 1
return (row, column)
def move_left_down(row, column, rows,cols):
if column == 0 or row == rows - 1: # 此时已到左边边界或底部
row, column = turn(row, column, rows,cols)
return (row, column, 1) # 返回下一步开始的坐标,改变下一次扫描方向,向右上
else: # 向左下角移动
row += 1
column -= 1
return (row, column, 0) # 返回下一步开始的坐标,不改变扫描方向
def move_right_up(row, column, rows,cols):
if row == 0 or column == cols - 1: # 此时已到右边边界或顶部
row, column = turn(row, column, rows,cols)
return (row, column, 0) # 返回下一步开始的坐标,改变扫描方向,向左下
else: # 向右上角移动
row -= 1
column += 1
return (row, column, 1) # 返回下一步开始的坐标,不改变扫描方向
def Z(matrix):
rows, cols = matrix.shape[:2]
print(f"输入Z扫描的矩阵:\n高度为 {rows},宽度为 {cols}")
z = []
z.append(matrix[0][0])
# 打印左上角元素
row = 0
column = 1
move_index = 0 # 0: left_down, 1: right_up。
# 依次打印扫描到的元素
while row < rows and column < cols:
z.append(matrix[row][column])
if move_index == 0: # 0与1交替,决定了扫描移动的方向
row, column, move_index = move_left_down(row, column, rows, cols)
else:
row, column, move_index = move_right_up(row, column, rows, cols)
return z
if __name__ == '__main__':
dct=[[1,2,3],[4,5,6],[7,8,9]]
matrix = np.array(dct)
print("matrix:\n",matrix)
print("matrix的类型:",type(matrix))
z=Z(matrix)
print("z字型扫描后为:", z)
print("z的类型:",type(z))
运行结果如下:
若需要在pycharm的其它py文件中使用该Z字型扫描功能,仅需导入“你为该Z字型扫描设置的py”文件名 (如,Z.py,该Z.py里有以上代码),随后在你需要Z字型扫描的py内,加入
import Z
z=Z.Z("你要输入的二维数组")
第一个Z是包含上述代码的.py文件,第二个Z是Z.py文件内的Z函数。(第一个Z仅仅是你自己的命名的包含Z字型扫描的py文件名)