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
Julio Diaz
sumber

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')]
jfs
sumber
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.

sqwerl
sumber
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')]
bigjim
sumber
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')
Irshad Bhat
sumber
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 .

Ned Batchelder
sumber
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)
Franck Dernoncourt
sumber
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 ] ) ) ]
leetNightshade
sumber
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=' '))
Vanuan
sumber
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)

sharif_42
sumber
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)
Hassan Bahaloo
sumber
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]))]
puisi rasoul
sumber
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)
Asterisk
sumber
-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'
roo.firebolt
sumber
-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)
chaitanya
sumber
-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
mohammad hassan jafari
sumber
-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
sumber
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

pengguna2412711
sumber
-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(' ')
MK Rana
sumber
1
Ini tidak berguna!
tripulse