Matriks Transpose dalam Python


143

Saya mencoba untuk membuat fungsi transpose matriks untuk python tapi sepertinya saya tidak bisa membuatnya berfungsi. Katakan saya punya

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

dan saya ingin fungsi saya muncul

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

Jadi dengan kata lain, jika saya mencetak array 2D ini sebagai kolom dan baris saya ingin baris berubah menjadi kolom dan kolom menjadi baris.

Saya membuat ini sejauh ini tetapi tidak berhasil

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

Jawaban:


308

Python 2:

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

Python 3:

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

15
jika Anda akan mengulangi hasilnya, izipdari itertoolsdapat menghemat memori untuk array besar.
Antony Hatchkins

Bagaimana Anda membuatnya mengembalikan daftar untuk sub daftar? Suka [['a', 'b', 'g'], ['d', 'e', 'h'], ['c', 'f', 'i']]bukan [('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]?
acollection_

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

1
@AntonyHatchkins Ini tidak diperlukan dengan Python 3.0 dan di atasnya. Di sana, zipsudah mengembalikan iterator: docs.python.org/3.0/whatsnew/…
xuiqzy

1
@ xuiqzy Bukannya saya tidak menyadarinya, tapi itu benar.
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']]

generator daftar membuat array 2d baru dengan item daftar bukan tupel.


Ini adalah cara untuk pergi jika Anda ingin menetapkan hasil ke variabel (berlawanan dengan, misalnya, iterasi secara langsung) - dengan asumsi Anda ingin daftar bukan tupel, seperti yang disebutkan.
ASL

Pilihan lain (seperti yang tersirat dari komentar dalam jawaban yang diterima) adalah:list(map(list, zip(*theArray)))
ASL

37

Jika baris Anda tidak sama, Anda juga dapat menggunakan map:

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

Sunting: Di Python 3 fungsi yang mapdiubah, itertools.zip_longestdapat digunakan sebagai gantinya:
Sumber: Apa yang Baru Di 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

Jauh lebih mudah dengan 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

Masalah dengan kode asli Anda adalah bahwa Anda diinisialisasi transpose[t]pada setiap elemen, bukan hanya sekali per baris:

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

Ini berfungsi, meskipun ada lebih banyak cara Pythonic untuk mencapai hal yang sama, termasuk zipaplikasi @ JF .


1
Perhatikan bahwa implementasi ini tidak bekerja dengan matriks yang memiliki jumlah kolom dan baris yang berbeda
Vektor

4

Untuk melengkapi jawaban JF Sebastian, jika Anda memiliki daftar daftar dengan panjang yang berbeda, lihat pos hebat ini dari ActiveState . Pendeknya:

Zip fungsi bawaan melakukan pekerjaan yang serupa, tetapi memotong hasilnya hingga sepanjang daftar terpendek, sehingga beberapa elemen dari data asli dapat hilang setelahnya.

Untuk menangani daftar daftar dengan panjang berbeda, gunakan:

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)

Itu tangkapan yang bagus. Namun, matriks tidak memiliki daftar dengan panjang yang berbeda.
Olli

Itu tergantung pada bagaimana mereka disimpan.
Franck Dernoncourt

3

Jawaban "terbaik" telah dikirimkan, tetapi saya pikir saya akan menambahkan bahwa Anda dapat menggunakan pemahaman daftar bersarang, seperti yang terlihat dalam Tutorial Python .

Berikut ini cara Anda bisa mendapatkan array yang dipindahkan:

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

1

Yang ini akan mempertahankan bentuk persegi panjang, sehingga transpos selanjutnya akan mendapatkan hasil yang tepat:

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

1

Anda dapat mencoba ini dengan pemahaman daftar seperti berikut ini

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

Jika Anda ingin mengubah urutan matriks seperti A = np.array ([[1,2], [3,4]]), maka Anda dapat menggunakan AT, tetapi untuk vektor seperti a = [1,2], aT tidak mengembalikan transpos! dan Anda perlu menggunakan a.reshape (-1, 1), seperti di bawah ini

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

Anda dapat melakukannya hanya dengan menggunakan pemahaman python.

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

Meskipun ini mungkin jawaban yang benar. Dua baris kode tidak terlalu berguna tanpa penjelasan tentang apa dan bagaimana cara memecahkan pertanyaan awal. Harap berikan perincian untuk jawaban Anda.
RyanNerd

1
saat memposting jawaban baru untuk pertanyaan lama, harapannya tinggi. Tolong jangan posting solusi yang lebih rendah dari yang sudah diposting
Jean-François Fabre

-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

Ini implementasi sederhana untuk transpose, meskipun ada perpustakaan seperti yang disebutkan dalam jawaban lain juga tersedia.
Ravneet Singh

-4

`

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

`Fungsi ini akan mengembalikan transpose


-4

Program Python untuk mengubah posisi matriks:

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
Ini tidak berguna!
tripulse
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.