【问题标题】:Converting list into matrix将列表转换为矩阵
【发布时间】:2021-02-04 16:37:34
【问题描述】:

假设我有一个数字列表

L = [16, 5, 14, 7, 21, 9, 14, 19, 27, 1, 18, 5,27, 15, 14, 5, 27, 20, 15, 27, 15, 14, 5]

我想将L 转换为 3x1 向量,直到使用整个 L。如果没有足够的条目,我们使用 27。然后我们对向量进行扩充,形成一个矩阵。

我该怎么做?有人可以给个提示吗?

【问题讨论】:

  • 第一步是指定您希望矩阵在代码中的精确表示方式。作为嵌套列表?作为一个 numpy 二维数组?作为一个 numpy 矩阵?

标签: python python-3.x list matrix data-conversion


【解决方案1】:

让我们尽量保持简单。如果您的列表长度小于 3 的倍数。只需将其附加 27s!。之后,您可以将其分成 3 行和剩余的列。试试这个方法-

  1. 在列表中追加 27 的数量,使列表的长度可以被 3 整除
  2. 在这种情况下,在长度/3 = 8 的块上迭代和中断列表。
L=[16, 5, 14, 7, 21, 9, 14, 19, 27, 1, 18, 5,27, 15, 14, 5, 27, 20, 15, 27, 15, 14, 5]

L2 = L+[27]*(3-len(L)%3) #Append list
n = int(len(L2)/3)       #Get number of cols
L3 = [L2[i:i+n] for i in range(0,len(L2),n)] #chunk list
L3
[[16, 5, 14, 7, 21, 9, 14, 19],
 [27, 1, 18, 5, 27, 15, 14, 5],
 [27, 20, 15, 27, 15, 14, 5, 27]]

【讨论】:

    【解决方案2】:

    您可以使用while 循环:

    L = [16, 5, 14, 7, 21, 9, 14, 19, 27, 1, 18, 5, 27, 15, 14, 5, 27, 20, 15, 27, 15, 14, 5]
    v = 3
    
    M = [[] for _ in range(v)]
    r = 0
    for i in L:
        M[r].append(i)
        r += 1
        if r == v:
            r = 0
    

    输出:

    [[16, 7, 14, 1, 27, 5, 15, 14],
     [5, 21, 19, 18, 15, 27, 27, 5],
     [14, 9, 27, 5, 14, 20, 15]]
    

    解释:

    1. 定义一个变量v 来存储矩阵的行数。

    2. 定义一个列表M,由v 的空列表组成。

    3. 定义一个变量i 来存储将附加另一个数字的行的索引。

    4. 遍历L 列表中的每个值,并将元素附加到M 列表中的i 索引处。

    5. i 索引增加1 以前进到下一个索引,如果索引超过M 的最大索引,则将其值恢复为0

    【讨论】:

      【解决方案3】:

      您可以使用列表推导将每个项目块转换为行(在列表列表中,也称为矩阵):

      L=[16, 5, 14, 7, 21, 9, 14, 19, 27, 1, 18, 5,27, 15, 14, 5, 27,
         20, 15, 27, 15, 14, 5]
      
      rows,cols,fill = 3,8,27
      
      M=[(L[c::rows]+[fill]*cols)[:cols] for c in range(rows)]
      
      print(*M,sep="\n")
      
      [16, 7, 14, 1, 27, 5, 15, 14]
      [5, 21, 19, 18, 15, 27, 27, 5]
      [14, 9, 27, 5, 14, 20, 15, 27]
      

      注意:如果输出矩阵中的元素少于源列表中的元素(例如 rows,cols=4,4),这也有效

      【讨论】:

      • 谢谢。如何将 16、5、14 放在第 1 行等等.. 请在 OP 中查看附图
      • 哦,这是按列显示的,抱歉我错过了...现在已修复。
      猜你喜欢
      • 2011-01-29
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-27
      • 2014-05-07
      • 2017-05-17
      相关资源
      最近更新 更多