データサイエンス

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

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

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

あわせて読みたい
【2019年完全保存版】データサイエンティストにおすすめのプログラミングスクール10選!AI・機械学習が学べる!この記事はデータサイエンティストになりたい、AIについて学びたい、という人向けのプログラミングスクールと、その選び方を紹介しています。自...

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

以上です。