データサイエンティストハトリのブログ

PythonとインテリジェントクラウドとAIが好きな学生エンジニア。データ分析、スクレイピング、就職活動などについて書いていきます。

【Python】Numpyのtransposeメソッドの文法や多次元配列の引数の使い方についてまとめた

f:id:hatorihatorihatorik:20180927215746p:plain


機械学習を学んでいる方や、Pythonをある程度学んだことがある方はNumpyというライブラリをご存知かと思います。

Numpyを使って配列の行と列を入れ替えたい時に、transposeメソッドを使うことが多いと思います。transposeメソッドは2次元配列であれば引数を使わなければ、簡単に転地してくれるのですが、3次元以降になってくると少し難しいです。
いろんなサイトでいい解説はないものかと探してみたのですが、なかなか見当たらなかったのでまとめてみました。
 

taransposeメソッドの公式ドキュメント

公式ドキュメントはこちらです

numpy.transpose — NumPy v1.15 Manual

 
numpy.transpose(a, axes=None)
Permute the dimensions of an array.

Parameters:

a : array_like
  Input array.

axes : list of ints, optional
  By default, reverse the dimensions, otherwise permute the axes
  according to the values given.


Returns:

p : ndarray
 a with its axes permuted. A view is returned whenever possible.

と書かれています。

transposeの使用例

import numpy as np
a = np.arange(6) #長さが6の配列を作る
a
# => array([0, 1, 2, 3, 4, 5])


reshapeメソッドで2行3列の配列に変換

a = a.reshape(2, 3)
a
# => array([[0, 1, 2],
#        [3, 4, 5]])


引数なしでtranspose

a.transpose()
# =>array([[0, 3],
#         [1, 4],
#         [2, 5]])


引数(0, 1)でtranspose

a.transpose(0, 1)
#array([[0, 1, 2],
#       [3, 4, 5]])


引数(0, 1)でtranspose

a.transpose(1, 0)
# =>  array([[0, 3],
#       [1, 4],
#       [2, 5]])

結構問題になってくるのがこの「引数(0, 1)でtranspose」と「引数(0, 1)でtranspose」の違いです。ドキュメントみてもよくわからない人が多いと思います。
(0, 1)はそのままで、(1, 0)は変換するんだ、などと暗記のように覚えている方も多いのではないでしょうか。

配列と同じように(0, 1, 2)という順番で次元を整理する

これは配列と同じように次元の順番ができている。という風に覚えました。

例えばこれだと2×3の行列式ですが、配列の0番目に0が、配列の1番目に1が入っている状態です。
どんな配列も自分で設定せずにデフォルトで(0, 1 )という設定がなされています。

引数(0, 1)でtranspose

引数(0, 1)でtransposeをした場合につちて考えましょう。

ここで出てくる引数の(0, 1)ってデフォルトの値と同じですよね?

なので、この引数(0, 1)でtransposeはデフォルトと同じ値になります。

引数(1, 0)でtranspose

引数(1, 0)でtransposeの場合を考えてみましょう。先ほどの(0, 1)と逆の値になっていることがわかるでしょう。

0番目の配列に1が、1番目の配列に0が入っていることがわかると思います。

このような場合、0番目の次元と、1番目の次元を入れ替えます。すなわち行と列を入れ替えることを意味します。

3次元配列でも同じことが言える

3次元配列でも同じようなことが言えます。


(3, 2, 2)の12個の行列を作成

b = np.arange(12)
b = b.reshape(3, 2, 2)

# array([[[ 0,  1],
#         [ 2,  3]],

#        [[ 4,  5],
#         [ 6,  7]],

#        [[ 8,  9],
#         [10, 11]]])


transposeを試してみる

b.transpose()
# array([[[ 0,  4,  8],
#         [ 2,  6, 10]],

#        [[ 1,  5,  9],
#         [ 3,  7, 11]]])

これは(2, 1, 0)と同義

b.transpose(2, 1, 0)
# array([[[ 0,  4,  8],
#         [ 2,  6, 10]],

#        [[ 1,  5,  9],
#         [ 3,  7, 11]]])


違った変換の仕方を試してみる

b.transpose(1, 2, 0)

# array([[[ 0,  4,  8],
#         [ 1,  5,  9]],

#        [[ 2,  6, 10],
#         [ 3,  7, 11]]])


以上です。