পাইথনে ম্যাট্রিক্স ট্রান্সপোজ


142

আমি পাইথনের জন্য একটি ম্যাট্রিক্স ট্রান্সপোজ ফাংশন তৈরি করার চেষ্টা করছি তবে আমি এটি কার্যকর করে দেখছি না। বলুন আমার আছে

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বড় অ্যারে জন্য মেমরি সংরক্ষণ করতে পারবেন।
অ্যান্টনি হ্যাচকিন্স

আপনি কীভাবে উপ-তালিকার জন্য একটি তালিকা ফেরত দিতে চান? [['a', 'b', 'g'], ['d', 'e', 'h'], ['c', 'f', 'i']]পরিবর্তে পছন্দ [('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]?
প্রশংসা_ফেব্রুয়ারি

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

1
অ্যান্টনিহ্যাচকিনস সেখানে, zipইতিমধ্যে একটি পুনরাবৃত্তির
৩.০

1
@ এক্সুইজি এটি এমন নয় যে আমি এটি সম্পর্কে সচেতন নই, তবে এটি সত্য।
অ্যান্টনি হ্যাচকিন্স

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

তালিকার জেনারেটর টিপলগুলির পরিবর্তে তালিকার আইটেমগুলির সাথে একটি নতুন 2 ডি অ্যারে তৈরি করে।


আপনি যদি কোনও পরিবর্তনকে ফলাফল নির্ধারণ করতে চান (তবে এর বিপরীতে যেমন প্রত্যক্ষভাবে পুনরাবৃত্তি করতে চান) - এই হিসাবে আপনি যাচ্ছেন, যেমনটি উল্লিখিত হিসাবে, টিপলসগুলির পরিবর্তে আপনি তালিকা চান তা ধরে নিচ্ছেন এই উপায়।
এএসএল

আরেকটি বিকল্প (যেমন গৃহীত উত্তরের মন্তব্যে বোঝানো হয়েছে) তা list(map(list, zip(*theArray)))
হ'ল

37

আপনার সারি সমান না হলে আপনি এটি ব্যবহার করতে পারেন map:

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

সম্পাদনা: পাইথন 3 এ mapপরিবর্তিত কার্যকারিতা পরিবর্তিত itertools.zip_longestহিসাবে ব্যবহার করা যেতে পারে:
উত্স: পাইথন 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

নামীর সাথে অনেক সহজ:

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

এটি কাজ করে, যদিও @ জেএফ এর zipঅ্যাপ্লিকেশন সহ একই জিনিসগুলি সম্পাদনের আরও পাইথোনিক উপায় রয়েছে ।


1
নোট করুন যে এই বাস্তবায়ন ম্যাট্রিকের সাথে কাজ করে না যার বিভিন্ন সংখ্যক কলাম এবং সারি রয়েছে
ভেক্টর

4

জেএফ সেবাস্তিয়ানের উত্তরটি সম্পূর্ণ করতে, আপনার যদি বিভিন্ন দৈর্ঘ্যের তালিকাগুলির তালিকা থাকে তবে অ্যাক্টিভেট থেকে এই দুর্দান্ত পোস্টটি দেখুন । সংক্ষেপে:

অন্তর্নির্মিত ফাংশন জিপটি একই রকম কাজ করে তবে ফলাফলটিকে সংক্ষিপ্ত তালিকার দৈর্ঘ্যে ছাঁটাই করে দেয়, সুতরাং মূল ডেটা থেকে কিছু উপাদান পরে হারিয়ে যেতে পারে।

বিভিন্ন দৈর্ঘ্যের সাথে তালিকাগুলির তালিকা পরিচালনা করতে, ব্যবহার করুন:

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)

এটা ভাল ধরা। তবে ম্যাট্রিকের বিভিন্ন দৈর্ঘ্যের তালিকা নেই।
অলি

এটি কীভাবে সংরক্ষণ করা হয় তার উপর নির্ভর করে।
ফ্রাঙ্ক ডারননকোর্ট

3

"সেরা" উত্তরটি ইতিমধ্যে জমা দেওয়া হয়েছে, তবে আমি ভেবেছিলাম যে আমি যুক্ত করব যে আপনি পাইস্টন টিউটোরিয়ালে যেমন দেখেছেন তেমন নেস্টেড তালিকা উপলব্ধিগুলি ব্যবহার করতে পারেন ।

আপনি এখানে স্থানান্তর অ্যারে কীভাবে পেতে পারেন তা এখানে:

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]]) এর মতো ম্যাট্রিক্স স্থানান্তর করতে চান তবে আপনি কেবল এটি ব্যবহার করতে পারেন তবে একটি ভেক্টরের জন্য = [1,2], aT কোনও ট্রান্সপোজ ফেরত দেয় না! এবং আপনাকে নীচের মত aresrespe (-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]))]

যদিও এটি একটি সঠিক উত্তর হতে পারে। কী এবং কীভাবে এটি আসল প্রশ্নটি সমাধান করে তার ব্যাখ্যা ব্যতীত দুটি লাইনের কোড খুব কার্যকর নয়। আপনার উত্তর বিশদ সরবরাহ করুন।
রায়াননার্ড

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

এটি একটি ট্রান্সপোজের জন্য একটি সহজ বাস্তবায়ন, যদিও অন্যান্য উত্তরে উল্লিখিত লাইব্রেরিও পাওয়া যায়।
রবনিতে সিং

-4

`

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

Function এই ফাংশনটি ট্রান্সপোজ ফিরিয়ে দেবে


-4

পাইথন প্রোগ্রাম ম্যাট্রিক্স স্থানান্তর করতে:

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
এটি দরকারী নয়!
ট্রিপলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.