【问题标题】:How to make matrices in Python?如何在 Python 中制作矩阵?
【发布时间】:2013-10-05 17:47:15
【问题描述】:

我已经用谷歌搜索了它并搜索了 StackOverflow 和 YouTube.. 我只是无法在 Python 中获得矩阵来点击我的脑海。有人可以帮帮我吗?我只是想创建一个基本的 5x5 框来显示:

A A A A A
B B B B B
C C C C C
D D D D D
E E E E E

我明白了

a b c d e
a b c d e
a b c d e
a b c d e
a b c d e

要显示,但我什至无法让它们换行,而是将它们全部显示为

[['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E']]

如果我尝试向它们添加 \n 或打印 "" 等,它就不起作用了。\n 将显示为 'A\n' 并且 print 将显示在矩阵之前。

请有人帮助我,即使您将我引导到应该非常明显的地方并使我看起来像个白痴,我也只是想学习这个。

【问题讨论】:

  • 请显示您用来尝试执行此操作的代码。
  • 如果您希望对矩阵进行大量工作,您可能需要查看Numpy
  • 如果您的列包含您想要使用的不同数据类型,您可能需要查看pandas

标签: python matrix


【解决方案1】:

问题的答案取决于您的学习目标是什么。如果您试图让矩阵“单击”以便以后使用它们,我建议您查看 Numpy array 而不是列表列表。这将使您可以轻松地切出行、列和子集。只需尝试从列表列表中获取一列,您就会感到沮丧。

将列表列表用作矩阵...

我们以你的列表为例:

L = [list("ABCDE") for i in range(5)]

很容易获取任意行的子元素:

>>> L[1][0:3]
['A', 'B', 'C']

或整行:

>>> L[1][:]
['A', 'B', 'C', 'D', 'E']

但是尝试翻转它以获得列格式的相同元素,它不会起作用...

>>> L[0:3][1]
['A', 'B', 'C', 'D', 'E']

>>> L[:][1]
['A', 'B', 'C', 'D', 'E']

您必须使用列表推导之类的方法来获取所有第 1 个元素....

>>> [x[1] for x in L]
['B', 'B', 'B', 'B', 'B']

输入矩阵

如果您改用数组,您将获得 MATLAB 或 R(或大多数其他语言,就此而言)所期望的切片和索引:

>>> import numpy as np
>>> Y = np.array(list("ABCDE"*5)).reshape(5,5)
>>> print Y
[['A' 'B' 'C' 'D' 'E']
 ['A' 'B' 'C' 'D' 'E']
 ['A' 'B' 'C' 'D' 'E']
 ['A' 'B' 'C' 'D' 'E']
 ['A' 'B' 'C' 'D' 'E']]
>>> print Y.transpose()
[['A' 'A' 'A' 'A' 'A']
 ['B' 'B' 'B' 'B' 'B']
 ['C' 'C' 'C' 'C' 'C']
 ['D' 'D' 'D' 'D' 'D']
 ['E' 'E' 'E' 'E' 'E']]

抓取第 1 行(与列表一样):

>>> Y[1,:]
array(['A', 'B', 'C', 'D', 'E'], 
      dtype='|S1')

获取第 1 列(新!):

>>> Y[:,1]
array(['B', 'B', 'B', 'B', 'B'], 
      dtype='|S1')

现在来生成你的打印矩阵:

for mycol in Y.transpose():
    print " ".join(mycol)


A A A A A
B B B B B
C C C C C
D D D D D
E E E E E

【讨论】:

  • 不过,一个 numpy 数组对于非数值数据没有多大意义。
  • 不知道why not?
  • 因为那样的话他们在性能(他们将字符串存储为 Python 对象)或便利性(它们最方便计算)方面并没有买太多东西。 OP 可能希望通过执行简单任务来学习 Python 基础知识,为此,使用列表是完美的练习。
  • P.S.你的用户名很有趣。起初我迷路了。
【解决方案2】:

循环帮助:

for row in matrix:
    print ' '.join(row)

或使用嵌套的str.join() 调用:

print '\n'.join([' '.join(row) for row in matrix])

演示:

>>> matrix = [['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E'], ['A', 'B', 'C', 'D', 'E']]
>>> for row in matrix:
...     print ' '.join(row)
... 
A B C D E
A B C D E
A B C D E
A B C D E
A B C D E
>>> print '\n'.join([' '.join(row) for row in matrix])
A B C D E
A B C D E
A B C D E
A B C D E
A B C D E

如果要显示转置的行和列,请使用zip() function 转置矩阵;如果将每一行作为单独的参数传递给函数,zip() 会将这些值按值重新组合为列的元组。 *args 语法允许您将整个行序列作为单独的参数应用:

>>> for cols in zip(*matrix):  # transposed
...     print ' '.join(cols)
... 
A A A A A
B B B B B
C C C C C
D D D D D
E E E E E

【讨论】:

  • @Martjin:好的。我没有意识到这会对性能产生重大影响。
  • 非常感谢!这对我帮助很大:)
  • 这是一个合理的解决方案,但不会像最初发布的那样在列中打印“行”。
  • @beroe:你知道的,我好像错过了移调;添加到。
【解决方案3】:

你也可以使用附加功能

b = [ ]

for x in range(0, 5):
    b.append(["O"] * 5)

def print_b(b):
    for row in b:
        print " ".join(row)

【讨论】:

    【解决方案4】:

    你可以这样写:

    matrix = [["A, B, C, D, E"]*5]
    print(matrix)
    
    
    [['A, B, C, D, E', 'A, B, C, D, E', 'A, B, C, D, E', 'A, B, C, D, E', 'A, B, C, D, E']]
    

    【讨论】:

      【解决方案5】:

      我通过将列表转换为字符串并执行字符串操作以从矩阵中正确打印出一个简单的解决方法。

      创建函数

      通过创建函数,省去了每次要打印矩阵时编写for循环的麻烦。

      def print_matrix(matrix):
          for row in matrix:
              new_row = str(row)
              new_row = new_row.replace(',','')
              new_row = new_row.replace('[','')
              new_row = new_row.replace(']','')
              print(new_row)
      

      示例

      0 作为每个条目的 5x5 矩阵示例:

      >>> test_matrix = [[0] * 5 for i in range(5)]
      >>> print_matrix(test_matrix)
      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 作为每个条目的 2x3 矩阵示例:

      >>> test_matrix = [[0] * 3 for i in range(2)]
      >>> print_matrix(test_matrix)
      0 0 0
      0 0 0
      

      编辑

      如果你想让它打印出来:

      A A A A A
      B B B B B
      C C C C C
      D D D D D 
      E E E E E
      

      我建议您更改将数据输入到列表中的列表的方式。在我的方法中,较大列表中的每个列表都代表矩阵中的一行,而不是列。

      【讨论】:

        【解决方案6】:

        如果你不想使用 numpy,你可以使用列表的概念。要创建任何二维数组,只需使用以下语法:

          mat = [[input() for i in range (col)] for j in range (row)]
        

        然后输入你想要的值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-06
          • 2023-01-07
          • 1970-01-01
          • 1970-01-01
          • 2021-11-12
          • 1970-01-01
          • 2020-07-30
          • 2012-11-17
          相关资源
          最近更新 更多