【问题标题】:creating a binary matrix using list values使用列表值创建二进制矩阵
【发布时间】:2021-12-15 04:42:26
【问题描述】:

我是 python 和堆栈溢出的新手。 如果客户存在于给定列表中,我需要创建一个值为 1 的二进制矩阵。 例如: 假设一个列表为 [4,5,8]。 我需要一个 10x10 矩阵,除 matrix[4,5]、matrix[5,4]、matrix[5,8]、matrix[8,5] 和 matrix[4,8]、matrix[8,4] 之外全为零是 1。 是否有捷径可寻? 谢谢。

【问题讨论】:

    标签: python list numpy matrix


    【解决方案1】:

    你有:

    data = [4, 5, 8]
    

    你计算:

    matrix = [[int(c in data and r in data and c != r) for c in range(10)] for r in range(10)]
    

    你得到:

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

    上面显示的解决方案使用从零开始的索引。

    【讨论】:

      【解决方案2】:

      您可以使用numpy 作为矢量化而不使用for-loop,如下所示:

      arr = [4,5,8]
      idx = np.array(np.meshgrid(arr,arr)).T.reshape(-1,2)
      
      #romove (4,4) , (5,5) , (8,8)
      idx = idx[idx[:,0] != idx[:,1]]
      
      mtx = np.zeros((10,10))
      
      mtx[idx[:,0], idx[:,1]] = 1
      print(mtx)
      

      输出:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-29
        • 1970-01-01
        • 2014-04-08
        • 2017-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多