파이썬에서 행렬 전치


143

파이썬에 대한 행렬 전치 함수를 만들려고하는데 작동하지 않는 것 같습니다. 내가 가지고 있다고

theArray = [['a','b','c'],['d','e','f'],['g','h','i']]

나는 내 기능을 생각해 내고 싶다.

newArray = [['a','d','g'],['b','e','h'],['c', 'f', 'i']]

즉,이 2D 배열을 열과 ​​행으로 인쇄하려면 행을 열로, 열을 행으로 바꾸고 싶습니다.

나는 이것을 지금까지 만들었지 만 작동하지 않습니다

def matrixTranspose(anArray):
    transposed = [None]*len(anArray[0])
    for t in range(len(anArray)):
        for tt in range(len(anArray[t])):
            transposed[t] = [None]*len(anArray)
            transposed[t][tt] = anArray[tt][t]
    print transposed

답변:


308

파이썬 2 :

>>> theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
>>> zip(*theArray)
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]

파이썬 3 :

>>> [*zip(*theArray)]
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]

15
경우는 결과를 반복 갈거야 izip에서 itertools큰 배열을위한 메모리를 절약 할 수 있습니다.
Antony Hatchkins

하위 목록에 대한 목록을 어떻게 반환합니까? 마찬가지로 [['a', 'b', 'g'], ['d', 'e', 'h'], ['c', 'f', 'i']]대신 [('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]?
acollection_

13
@acollection_ : map(list, zip(*theArray)).
jfs

1
@AntonyHatchkins 이것은 Python 3.0 이상에서는 필요하지 않습니다. 거기에 zip이미 반복자를 반환합니다 : docs.python.org/3.0/whatsnew/…
xuiqzy 13:06의

1
@xuiqzy 내가 모르는 것은 아니지만 사실입니다.
Antony Hatchkins

64
>>> theArray = [['a','b','c'],['d','e','f'],['g','h','i']]
>>> [list(i) for i in zip(*theArray)]
[['a', 'd', 'g'], ['b', 'e', 'h'], ['c', 'f', 'i']]

목록 생성기는 튜플 대신 목록 항목으로 새로운 2D 배열을 만듭니다.


언급 한대로 튜플 대신 목록을 원한다고 가정 할 때 결과를 변수에 지정하려는 경우 (예 : 직접 반복하는 것과 달리)이 방법을 사용합니다.
ASL

또 다른 옵션 (허용 된 답변의 의견에서 암시 됨)은 다음과 같습니다.list(map(list, zip(*theArray)))
ASL

37

행이 같지 않으면 다음을 사용할 수도 있습니다 map.

>>> uneven = [['a','b','c'],['d','e'],['g','h','i']]
>>> map(None,*uneven)
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', None, 'i')]

편집 : Python 3에서는 map변경된 기능을 itertools.zip_longest대신 사용할 수 있습니다.
출처 : Python 3.0의 새로운 기능

>>> import itertools
>>> uneven = [['a','b','c'],['d','e'],['g','h','i']]
>>> list(itertools.zip_longest(*uneven))
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', None, 'i')]

15

numpy를 사용하면 훨씬 쉽습니다.

>>> arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> arr
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> arr.T
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])
>>> theArray = np.array([['a','b','c'],['d','e','f'],['g','h','i']])
>>> theArray 
array([['a', 'b', 'c'],
       ['d', 'e', 'f'],
       ['g', 'h', 'i']], 
      dtype='|S1')
>>> theArray.T
array([['a', 'd', 'g'],
       ['b', 'e', 'h'],
       ['c', 'f', 'i']], 
      dtype='|S1')

6

원래 코드의 문제점은 transpose[t]행당 한 번이 아니라 모든 요소에서 초기화되었다는 것입니다 .

def matrixTranspose(anArray):
    transposed = [None]*len(anArray[0])
    for t in range(len(anArray)):
        transposed[t] = [None]*len(anArray)
        for tt in range(len(anArray[t])):
            transposed[t][tt] = anArray[tt][t]
    print transposed

@JF의 zip응용 프로그램을 포함하여 동일한 일을 수행하는 더 많은 Pythonic 방법이 있지만 작동 합니다.


1
이 구현은 서로 다른 개수의 열과 행을 가진 행렬에서는 작동하지 않습니다.
Vector

4

JF Sebastian의 답변을 완성하려면 길이가 다른 목록 목록이 있으면 ActiveState 에서이 위대한 게시물을 확인하십시오 . 한마디로 :

내장 함수 zip은 비슷한 작업을 수행하지만 결과를 가장 짧은 목록의 길이로 자르므로 원래 데이터의 일부 요소가 나중에 손실 될 수 있습니다.

길이가 다른 목록 목록을 처리하려면 다음을 사용하십시오.

def transposed(lists):
   if not lists: return []
   return map(lambda *row: list(row), *lists)

def transposed2(lists, defval=0):
   if not lists: return []
   return map(lambda *row: [elem or defval for elem in row], *lists)

잘 잡았습니다. 그러나 행렬에는 길이가 다른 목록이 없습니다.
Olli

저장 방법에 따라 다릅니다.
Franck Dernoncourt

3

"최고의"답변이 이미 제출되었지만 Python Tutorial 에서 볼 수 있듯이 중첩 목록 이해를 사용할 수 있다고 덧붙였습니다 .

다음은 조옮김 배열을 얻는 방법입니다.

def matrixTranspose( matrix ):
    if not matrix: return []
    return [ [ row[ i ] for row in matrix ] for i in range( len( matrix[ 0 ] ) ) ]

1

이것은 직사각형 모양을 유지하므로 후속 조옮김이 올바른 결과를 얻습니다.

import itertools
def transpose(list_of_lists):
  return list(itertools.izip_longest(*list_of_lists,fillvalue=' '))

1

다음과 같은 목록 이해로 이것을 시도 할 수 있습니다

matrix = [['a','b','c'],['d','e','f'],['g','h','i']] n = len(matrix) transpose = [[row[i] for row in matrix] for i in range(n)] print (transpose)


0

A = np.array ([[1,2], [3,4]])와 같은 행렬을 바꾸려면 간단히 AT를 사용할 수 있지만 a = [1,2]와 같은 벡터에는 aT 조옮김을 반환하지 않습니다! 아래와 같이 a.reshape (-1, 1)을 사용해야합니다.

import numpy as np
a = np.array([1,2])
print('a.T not transposing Python!\n','a = ',a,'\n','a.T = ', a.T)
print('Transpose of vector a is: \n',a.reshape(-1, 1))

A = np.array([[1,2],[3,4]])
print('Transpose of matrix A is: \n',A.T)

0

파이썬 이해를 사용하여 간단하게 수행 할 수 있습니다.

arr = [
    ['a', 'b', 'c'], 
    ['d', 'e', 'f'], 
    ['g', 'h', 'i']
]
transpose = [[arr[y][x] for y in range(len(arr))] for x in range(len(arr[0]))]

이것은 정답 일 수 있지만. 두 줄의 코드는 원래 질문을 어떻게, 어떻게 해결하는지에 대한 설명이 없으면별로 유용하지 않습니다. 답변에 자세한 내용을 알려주십시오.
RyanNerd

1
오래된 질문에 대한 새로운 답변을 게시 할 때 기대치가 높습니다. 이미 게시 것과 열등한 솔루션을 게시하지 마십시오
장 - 프랑수아 파브르

-1
def matrixTranspose(anArray):
  transposed = [None]*len(anArray[0])

  for i in range(len(transposed)):
    transposed[i] = [None]*len(transposed)

  for t in range(len(anArray)):
    for tt in range(len(anArray[t])):            
        transposed[t][tt] = anArray[tt][t]
  return transposed

theArray = [['a','b','c'],['d','e','f'],['g','h','i']]

print matrixTranspose(theArray)

-3
#generate matrix
matrix=[]
m=input('enter number of rows, m = ')
n=input('enter number of columns, n = ')
for i in range(m):
    matrix.append([])
    for j in range(n):
        elem=input('enter element: ')
        matrix[i].append(elem)

#print matrix
for i in range(m):
    for j in range(n):
        print matrix[i][j],
    print '\n'

#generate transpose
transpose=[]
for j in range(n):
    transpose.append([])
    for i in range (m):
        ent=matrix[i][j]
        transpose[j].append(ent)

#print transpose
for i in range (n):
    for j in range (m):
        print transpose[i][j],
    print '\n'

-4
a=[]
def showmatrix (a,m,n):
    for i in range (m):
        for j in range (n):
            k=int(input("enter the number")
            a.append(k)      
print (a[i][j]),

print('\t')


def showtranspose(a,m,n):
    for j in range(n):
        for i in range(m):
            print(a[i][j]),
        print('\t')

a=((89,45,50),(130,120,40),(69,79,57),(78,4,8))
print("given matrix of order 4x3 is :")
showmatrix(a,4,3)


print("Transpose matrix is:")
showtranspose(a,4,3)

-4
def transpose(matrix):
   x=0
   trans=[]
   b=len(matrix[0])
   while b!=0:
       trans.append([])
       b-=1
   for list in matrix:
       for element in list:
          trans[x].append(element)
          x+=1
       x=0
   return trans

-4
def transpose(matrix):
    listOfLists = []
    for row in range(len(matrix[0])):
        colList = []
        for col in range(len(matrix)):
            colList.append(matrix[col][row])
    listOfLists.append(colList)

    return listOfLists

다른 답변에서 언급 된 것과 같은 라이브러리도 있지만 전치에 대한 간단한 구현도 가능합니다.
Ravneet Singh 2

-4

`

def transpose(m):
    return(list(map(list,list(zip(*m)))))

`이 함수는 조옮김을 반환합니다


-4

행렬을 전치하는 Python 프로그램 :

row,col = map(int,input().split())
matrix = list()

for i in range(row):
    r = list(map(int,input().split()))
    matrix.append(r)

trans = [[0 for y in range(row)]for x in range(col)]

for i in range(len(matrix[0])):
    for j in range(len(matrix)):
        trans[i][j] = matrix[j][i]     

for i in range(len(trans)):
    for j in range(len(trans[0])):
        print(trans[i][j],end=' ')
    print(' ')

1
이것은 유용하지 않습니다!
tripulse
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.