2 条题解

  • 0
    @ 2026-3-26 22:34:13

    NUMPY019 题解:棋盘矩阵

    题目

    创建 n×nn \times n 棋盘矩阵,左上角为 0,黑白相间。

    示例(n=4):

    [[0 1 0 1]
     [1 0 1 0]
     [0 1 0 1]
     [1 0 1 0]]
    

    代码

    import numpy as np
    
    n = int(input())
    Z = np.zeros((n, n), dtype=int)
    Z[1::2, ::2] = 1
    Z[::2, 1::2] = 1
    print(Z)
    

    代码详解

    第一步:创建全0矩阵

    Z = np.zeros((n, n), dtype=int)
    

    第二步:填充奇偶位置

    Z[1::2, ::2] = 1   # 奇数行、偶数列
    Z[::2, 1::2] = 1   # 偶数行、奇数列
    

    图解(n=4):

          列: 0  1  2  3
    行 0:   0  1  0  1    ← 偶行奇列设为1
    行 1:   1  0  1  0    ← 奇行偶列设为1
    行 2:   0  1  0  1
    行 3:   1  0  1  0
    

    切片步长详解

    切片 含义 示例 (n=4)
    ::2 从0开始,步长2 [0, 2]
    1::2 从1开始,步长2 [1, 3]
    :: 全部 [0, 1, 2, 3]

    方法2:利用行列索引之和

    import numpy as np
    
    n = int(input())
    Z = np.zeros((n, n), dtype=int)
    for i in range(n):
        for j in range(n):
            if (i + j) % 2 == 1:
                Z[i, j] = 1
    print(Z)
    

    原理:当 i+j 为奇数时,设置为 1。


    方法3:一行代码(详解)

    import numpy as np
    
    n = int(input())
    Z = (np.arange(n) + np.arange(n)[:, None]) % 2
    print(Z)
    

    这个方法比较难懂,一步步拆开看:

    第一步:创建行向量

    np.arange(n)
    # n=4 时,结果:[0, 1, 2, 3]
    

    第二步:创建列向量

    np.arange(n)[:, None]
    # [:, None] 把一维数组变成列向量(n×1)
    # 结果:
    # [[0]
    #  [1]
    #  [2]
    #  [3]]
    

    第三步:广播相加

    np.arange(n) + np.arange(n)[:, None]
    # 行向量 [0,1,2,3] 会广播到每一列
    # 列向量会广播到每一行
    # 结果:
    # [[0+0, 1+0, 2+0, 3+0],   [0, 1, 2, 3]
    #  [0+1, 1+1, 2+1, 3+1], = [1, 2, 3, 4]
    #  [0+2, 1+2, 2+2, 3+2],   [2, 3, 4, 5]
    #  [0+3, 1+3, 2+3, 3+3]]   [3, 4, 5, 6]
    

    第四步:取模2

    % 2
    # [0, 1, 2, 3] % 2 = [0, 1, 0, 1]
    # [1, 2, 3, 4] % 2 = [1, 0, 1, 0]
    # [2, 3, 4, 5] % 2 = [0, 1, 0, 1]
    # [3, 4, 5, 6] % 2 = [1, 0, 1, 0]
    

    图解

    广播相加:
             列: 0  1  2  3
    行 0:   [0  1  2  3]
    行 1: + [1  2  3  4]  ← 广播
    行 2:   [2  3  4  5]
    行 3:   [3  4  5  6]
    
    取模2后:
             列: 0  1  2  3
    行 0:   [0  1  0  1]
    行 1:   [1  0  1  0]
    行 2:   [0  1  0  1]
    行 3:   [1  0  1  0]
    

    广播原理

    • np.arange(n) 是 (4,) 形状的行向量
    • np.arange(n)[:, None] 是 (4,1) 形状的列向量
    • 相加时,行向量会复制到4行,列向量会复制到4列

    核心知识点

    知识点 说明
    np.zeros() 创建全0矩阵
    dtype=int 指定整数类型
    切片 [::2] 步长为2
    [:, None] 转成列向量
    广播 自动扩展维度进行运算
    • 0
      @ 2026-3-26 22:26:49

      NUMPY019 题解:棋盘矩阵

      题目

      创建 n×nn \times n 棋盘矩阵,左上角为 0,黑白相间。

      示例(n=4):

      [[0 1 0 1]
       [1 0 1 0]
       [0 1 0 1]
       [1 0 1 0]]
      

      代码

      import numpy as np
      
      n = int(input())
      Z = np.zeros((n, n), dtype=int)
      Z[1::2, ::2] = 1
      Z[::2, 1::2] = 1
      print(Z)
      

      代码详解

      第一步:创建全0矩阵

      Z = np.zeros((n, n), dtype=int)
      

      第二步:填充奇偶位置

      Z[1::2, ::2] = 1   # 奇数行、偶数列
      Z[::2, 1::2] = 1   # 偶数行、奇数列
      

      图解(n=4):

            列: 0  1  2  3
      行 0:   0  1  0  1    ← 偶行奇列设为1
      行 1:   1  0  1  0    ← 奇行偶列设为1
      行 2:   0  1  0  1
      行 3:   1  0  1  0
      

      切片步长详解

      切片 含义 示例 (n=4)
      ::2 从0开始,步长2 [0, 2]
      1::2 从1开始,步长2 [1, 3]
      :: 全部 [0, 1, 2, 3]

      其他实现方法

      方法2:利用行列索引之和

      import numpy as np
      
      n = int(input())
      Z = np.zeros((n, n), dtype=int)
      for i in range(n):
          for j in range(n):
              if (i + j) % 2 == 1:
                  Z[i, j] = 1
      print(Z)
      

      方法3:一行代码

      import numpy as np
      
      n = int(input())
      Z = (np.arange(n) + np.arange(n)[:, None]) % 2
      print(Z)
      

      核心知识点

      知识点 说明
      np.zeros() 创建全0矩阵
      dtype=int 指定整数类型
      切片 [::2] 步长为2
      1::2 从索引1开始,步长2
      • 1

      信息

      ID
      465
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      (无)
      递交数
      2
      已通过
      1
      上传者