機械学習を学んでいる方や、Pythonをある程度学んだことがある方はNumpyというライブラリをご存知かと思います。
Numpyを使って配列の行と列を入れ替えたい時に、transposeメソッドを使うことが多いと思います。transposeメソッドは2次元配列であれば引数を使わなければ、簡単に転地してくれるのですが、3次元以降になってくると少し難しいです。
いろんなサイトでいい解説はないものかと探してみたのですが、なかなか見当たらなかったのでまとめてみました。
Contents
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]]])
以上です。