Python の単一行で行列を転置する

Python で行列を転置するとは、行列を対角線上で反転して、すべての行を列に、すべての列を行に変えることを意味します。 たとえば [[1 2] [3 4] [5 6]] のような 3 行 2 列の行列は、転置すると 2 行 3 列の [[1 3 5] [2 4 6]] になります。これを効率的に行うためのさまざまな方法を理解しましょう。

リスト内包表記の使用

リスト内包表記は、行列内の各要素を反復処理するために使用されます。与えられた例では、行列 (m) の各要素を列優先で繰り返し、その結果を m の転置である rez 行列に割り当てます。

Python
   m   =   [[  1     2  ]   [  3     4  ]   [  5     6  ]]   res   =   [[  m  [  j  ][  i  ]   for   j   in   range  (  len  (  m  ))]   for   i   in   range  (  len  (  m  [  0  ]))]   for   row   in   res  :   print  (  row  )   

出力
[1 3 5] [2 4 6]  

説明: この式は、元の行列の各列を新しい行列の行として取得することにより、新しい行列を作成します。行と列を交換します。

ジップを歌う

Python Zip は、i 番目のタプルに各引数シーケンスまたはイテラブルの i 番目の要素が含まれるタプルのイテレータを返します。この例では、* を使用して配列を解凍し、それを圧縮して転置を取得します。

Python
   m   =   [(  1     2     3  )   (  4     5     6  )   (  7     8     9  )   (  10     11     12  )]   t_m   =   zip  (  *  m  )   for   row   in   t_m  :   print  (  row  )   

出力
(1 4 7 10) (2 5 8 11) (3 6 9 12)  

説明: このコードは行列を転置します メートル 使用して zip(*m) 。 * は行を解凍し、 ジップ() 要素を列ごとにグループ化します。各出力タプルは、行と列を効果的に交換する元の行列の列を表します。

NumPy の使用

Python NumPy は、大規模な多次元配列を効率的に操作するために設計された汎用の配列処理パッケージです。

例 1: transpose メソッドは、渡された多次元行列の転置ビューを返します。

Python
   import   numpy   m   =   [[  1     2     3  ]   [  4     5     6  ]]   print  (  numpy  .  transpose  (  m  ))   

出力
[[1 4] [2 5] [3 6]]  

説明: numpy.transpose() 行列 m の行と列を交換します。元の 2 行 3 列の行列を、効果的に転置した 3 行 2 列の行列に変換します。

例 2: 変数の後に「.T」を使用する

Python
   import   numpy   as   np   m   =   np  .  array  ([[  1     2     3  ]   [  4     5     6  ]])   print  (  m  .  T  )   

出力
[[1 4] [2 5] [3 6]]  

説明: このコードは、NumPy を使用して 2D 配列 m を作成し、その転置を次を使用して出力します。 .T 。の .T 属性は行と列を交換し、元の 2x3 行列を 3x2 転置行列に変換します。

Itertoolsの使用

Python itertools は、イテレータに作用して複雑なイテレータを生成するさまざまな関数を提供するモジュールです。 chain() は、一連の反復可能オブジェクトを受け取り、1 つの反復可能オブジェクトを返す関数です。

Python
   from   itertools   import   chain   import   time   import   numpy   as   np   def   transpose2  (  M  ):   M   =   M  .  tolist  ()   n   =   len  (  M  [  0  ])   L   =   list  (  chain  (  *  M  ))   return   [  L  [  i  ::  n  ]   for   i   in   range  (  n  )]   m   =   np  .  array  ([[  1     2     3  ]   [  4     5     6  ]])   start   =   time  .  time_ns  ()   res   =   transpose2  (  m  )   end   =   time  .  time_ns  ()   print  (  res  )   print  (  'Time taken'     end   -   start     'ns'  )   

出力
[[1 4] [2 5] [3 6]] Time taken 9813 ns  

説明: まず行列をリストのリストに変換し、chain(*M) を使用して単一のリストに平坦化してから、n 番目の要素ごとにスライスして転置行列を再構築します。

関連記事:

  • リスト内包表記
  • Python イターツール
  • パイソンジップ
  • 鎖()
  • タプル
  • Python NumPy