【问题标题】:How can I make a matrix print in a specific way in python?如何在 python 中以特定方式进行矩阵打印?
【发布时间】:2021-09-23 17:54:45
【问题描述】:

我想创建一个 N 乘 N 的矩阵,并且将 N 作为输入接收,并且当它以螺旋形式打印时。例如,如果输入为 4,则表示矩阵将为 4 x 4,打印时将如下所示:

1  2  3  4
12 13 14 5
11 16 15 6
10 9  8  7

我知道如何创建矩阵并使其 N 乘 N 我不知道如何使它看起来像这样。是否有任何指南、教程或任何我可以观看/阅读的内容来了解​​如何进行更多二维数组练习?

def llenar_matriz(n):
    # Fills the matrix
    for r in range(n):
        fila = []
        for c in range(n):
            fila.append(0)
        matriz.append(fila)
    return matriz

def imprimir_matriz(matriz):
    # Prints the matrix
    filas = len(matriz)
    columnas = len(matriz[0])
    for f in range(filas):
        for c in range(columnas):
            print ("%3d" %matriz[f][c], end="")
        print()

# Main program
lado = int(input("Ingrese el tamaño de la matriz: "))
while lado < 1:
    print("Tamaño inválido. Debe ser mayor que 0")
    lado = int(input("Ingrese el tamaño de la matriz: "))
matriz = []
llenar_matriz(lado)
imprimir_matriz(matriz)

这是我的代码 atm,它所做的只是创建一个 N 乘 N 的矩阵,用 0 填充它并打印出来

【问题讨论】:

标签: python arrays matrix


【解决方案1】:

算法:让数组有R行C列。 seen[r] 表示先前访问过第 r 行第 c 列的单元格。我们当前的位置是(r, c),面向方向di,我们要访问R x C个总细胞。

当我们在矩阵中移动时,候选者的下一个位置是 (cr, cc)。如果候选人在矩阵的范围内并且看不见,那么它将成为我们的下一个位置;否则,我们的下一个位置是顺时针转动后的位置。
代码:

def spiralOrder(matrix):
    ans = []
 
    if (len(matrix) == 0):
        return ans
 
    R = len(matrix)
    C = len(matrix[0])
    seen = [[0 for i in range(C)] for j in range(R)]
    dr = [0, 1, 0, -1]
    dc = [1, 0, -1, 0]
    r = 0
    c = 0
    di = 0
 
    # Iterate from 0 to R * C - 1
    for i in range(R * C):
        ans.append(matrix[r])
        seen[r] = True
        cr = r + dr[di]
        cc = c + dc[di]
 
        if (0 <= cr and cr < R and 0 <= cc and cc < C and not(seen[cr][cc])):
            r = cr
            c = cc
        else:
            di = (di + 1) % 4
            r += dr[di]
            c += dc[di]
    return ans
 
 
# Driver code
a = [[1, 2, 3, 4],
     [5, 6, 7, 8],
     [9, 10, 11, 12],
     [13, 14, 15, 16]]
 
for x in spiralOrder(a):
    print(x, end=" ")
print()

这是它如何工作的图片:

【讨论】:

    【解决方案2】:

    这是使用numpy的一种方式:

    # initialize test array
    a = np.arange(16).reshape(4,4)
    
    # spiral reshaping
    out = []
    while a.size:
        out.append(a[0])      # take first row
        a = np.rot90(a[1:])   # remove 1st row, rotate counter-clockwise
    out = np.concatenate(out) # concatenate output
    

    说明:取第一行,旋转数组的其余部分,重复直到所有数组都消失

    输入:

    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11],
           [12, 13, 14, 15]])
    

    输出:

    array([ 0,  1,  2,  3,  7, 11, 15, 14, 13, 12,  8,  4,  5,  6, 10,  9])
    

    【讨论】:

    • 基于OP发布的代码,我想这是一个家庭作业问题,图书馆被禁止。我的意思是,单行代码np.zeros((n, n)) 是用 26 行代码编写的。
    • @Karina 可能是,但它没有被提及(如果这是家庭作业,它是should be mentioned),所以我提供了我当时的想法;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 2016-09-02
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多