Попытка транспонировать матрицу из 3×4 в 4×3 в python

#python #python-3.x #command-line-arguments

#python #python-3.x #аргументы командной строки

Вопрос:

Я должен прочитать файл из командной строки, а также установить строки матрицы и столбцы. Когда я запускаю свою программу (ниже):

 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
  

Комментарии:

1. Обратите внимание, что название вашего вопроса на самом деле не имеет ничего общего с вашей реальной проблемой (которая находится в очень специфической части вашего кода, далекой от функциональности «транспонирования»).

2. Прочитано сообщение об ошибке. Устраните проблему. Переходите к следующему вопросу позже..

3. Кроме того, если это не домашнее задание (что кажется довольно вероятным), в пакете numpy есть функциональность для всех этих матричных операций.

4. это практика для нашего финала, и нам не разрешено использовать numpy

5. Вы не можете получить это сообщение об ошибке из опубликованного вами кода.

Ответ №1:

Транспонирование 2D-списка намного проще. Используйте zip() функцию вместе с оператором * распаковки:

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

Комментарии:

1. Эй, я просто хотел написать это. 🙂

2. мы должны прочитать в матрице из файла в программу, наш грейдер будет вводить случайные числа из отдельных файлов, чтобы проверить программу: (

3. @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
  

Комментарии:

1. я беру класс python, мы оцениваем / проверяем основные рекомендации python. иначе нет numpy: (