【问题标题】:Trying to transpose the matrix from a 3x4 to a 4x3 in python试图在python中将矩阵从3x4转置为4x3
【发布时间】:2014-06-26 17:11:13
【问题描述】:

我必须从命令行读取文件,并设置矩阵行和列。当我运行我的程序时(如下):

python3 transpose.py               matrix                                                 3 4
        (current code below) (file with numbers 1 2 3 4 5 6 7 8 9 10 11 12 13)  (matrix row,cols)

一起打印应该返回:

The empty matrix is:[[0,0,0,0],[0,0,0,0],[0,0,0,0]]
The original matrix is:
1 2 3 4
5 6 7 8
9 10 11 12

The transposed matrix is:
1 5 9
2 6 10
3 7 11
4 8 12

这是我的 transpose.py 我花了大约 10 个小时在它上面,但无法让它工作,我只是想不出还能做什么!

 import sys
from scanner import *


def main():
    readinput(sys.argv[1],[2])
    size = 3
    rows = size
    cols = rows
    makeList(size)
    matrix(rows,cols)
    manipulateMatrix(matrix(rows,cols))
    print(manipulateMatrix(matrix(rows,cols)))
    print("The original matrix is: ")
    displayMatrix(manipulateMatrix(matrix(rows,cols)))
    transposeSquare(manipulateMatrix(matrix(rows,cols)),size)
    print (transposeSquare(manipulateMatrix(matrix(rows,cols)),size))
    print("The transposed matrix: ")
    displayMatrix(transposeSquare(manipulateMatrix(matrix(rows,cols)),size))    
def readinput(filename,matrix):
    s = Scanner(filename)
    r = s.readtoken()
    while r != "":
        r = int(r)
        c = s.readint()
        v = s.readint()
        matrix[r][c]=v
        r = s.readtoken()
    s.close()

def makeList(size):
    lyst = []
    for i in range(size):
        lyst = lyst + [None]
    return lyst

def matrix(rows,cols):
    matrix = makeList(rows)
    for i in range(rows):
        matrix[i] = makeList(cols)
        return matrix

def manipulateMatrix(m):
    rows = len(m)
    cols = len(m[0])
    count = 1
    for r in range(0,rows,1):
        for c in range(0,cols,1):
            m[r][c] = count
            count += 1
    return m

def transposeSquare(m,size):
    for r in range(0,size):
         for c in range(0,size):
            m[r][c],m[c][r] = m[c][r],m[r][c]
    return m

def displayMatrix(m):
    m == rows == cols
    for r in range(0,size):
        for c in range(0,cols,1):
            print(m[r][c],end = "")
        print()
    return          
main()

现在我被困在

 Traceback (most recent call last):
  File "transpose.py", line 66, in <module>
    main()
  File "transpose.py", line 6, in main
    readinput(sys.argv[1],[2])
  File "transpose.py", line 27, in readinput
    matrix[r][c]=v
IndexError: list index out of range

【问题讨论】:

  • 请注意,您的问题的标题实际上与您的 actual 问题无关(这是代码的一个非常具体的部分,与“转置”功能相去甚远)。
  • 读取错误信息。解决问题。稍后继续下一个问题..
  • 另外,除非这是家庭作业(看起来很可能),否则 numpy 包中的所有这些矩阵运算都有功能。
  • 这是我们期末考试的练习,我们不能使用numpy
  • 您无法从您发布的代码中获取该错误消息。

标签: python python-3.x command-line-arguments


【解决方案1】:

转置 2D 列表要简单得多。将zip() function* 解包运算符一起使用:

>>> matrix = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
>>> new = list(zip(*matrix))  # call to list not necessary in Python 2
>>> new
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]

或者,如果你不想要元组:

>>> new = [list(tup) for tup in zip(*matrix)]
>>> new
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

【讨论】:

  • 嘿,我只是想写这个。 :-)
  • 我们必须从一个文件中读取矩阵到程序中,我们的评分员会从不同的文件中输入随机数来检查程序:(
  • @user3754670:这种方法仍然有效。或者您不知道如何读取文件?你的问题有点混乱……
【解决方案2】:

使用 numpy 库。它是为此目的而设计的,在 C/C++ 代码中运行数字,并且比在 python 中运行并且必须调试它要快得多。

import numpy as np
m = np.array(<your list matrix here>)
print m.shape # to see the shape of your matrix
mt = m.T #m.T transpose the matrix
print m.shape
print m

【讨论】:

  • 我正在学习 Python 课程,我们按照基本 Python 指南进行评分/检查。又名没有 numpy :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 2016-08-06
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
相关资源
最近更新 更多