如何在Python中制作矩阵?

时间:2013-09-29 23:27:59

标签: python matrix

我用Google搜索并搜索了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'并且打印将显示在矩阵之前。

请有人帮助我,即使你把我引导到一个非常明显的地方让我看起来像个白痴,我只是想学习这个。

6 个答案:

答案 0 :(得分:10)

您问题的答案取决于您的学习目标。如果您试图让矩阵“点击”以便以后可以使用它,我建议您查看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']

你必须使用像list comprehension这样的东西来获得所有第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

答案 1 :(得分:9)

循环有助于:

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

答案 2 :(得分:2)

你也可以使用追加功能

b = [ ]

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

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

答案 3 :(得分:0)

你可以这样做:

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']]

答案 4 :(得分:0)

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

创建功能

通过创建一个函数,每次要打印矩阵时,都可以省去编写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

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

答案 5 :(得分:0)

如果您不想使用numpy,则可以使用“列表列表”概念。要创建任何2D数组,只需使用以下语法:

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

,然后输入所需的值。