NumPy/pandasのDataFrameでの転置行列
NumPyでの転置行列 2015/08/31
2次元のndarrayで表現する行列の転置行列は T
というメソッドで簡単に表現することができる。
\[ \mathbf{X} = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{pmatrix} \]
\[ \mathbf{X}^T = \begin{pmatrix} 1 & 4 & 7 \\ 2 & 5 & 8 \\ 3 & 6 & 9 \\ \end{pmatrix} \]
X = np.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]])
print(X)
# 出力結果
# [[ 1. 2. 3.]
# [ 4. 5. 6.]
# [ 7. 8. 9.]]
t = X.T
print(t)
# 出力結果
# [[ 1. 4. 7.]
# [ 2. 5. 8.]
# [ 3. 6. 9.]]
T
を一般化した swapaxes
というメソッドもある。このメソッドは任意の軸を入れ替えることができる。以下の例では0番目の軸(外側の軸)と1番目の軸(内側の軸)を交換している。つまり、転置行列とまったく同じ。
print(X.swapaxes(0, 1))
# 出力結果
# [[ 1. 4. 7.]
# [ 2. 5. 8.]
# [ 3. 6. 9.]]
T
メソッドの結果はビューであるので、要素に値を代入すると、元の行列にも反映される。
t[1, 0] = 100
print(t)
# 出力結果
# [[ 1. 4. 7.]
# [ 100. 5. 8.]
# [ 3. 6. 9.]]
print(X)
# 出力結果
# [[ 1. 100. 3.]
# [ 4. 5. 6.]
# [ 7. 8. 9.]]
swapaxes
の例をもう少し挙げておくと、
# 3次元配列
ndarr1 = np.array([[[1., 2., 3.], [4., 5., 6.], [7., 8., 9.]], [[11., 12., 13.], [14., 15., 16.], [17., 18., 19.]]])
print(ndarr1)
# 出力結果
# [[[ 1. 2. 3.]
# [ 4. 5. 6.]
# [ 7. 8. 9.]]
#
# [[ 11. 12. 13.]
# [ 14. 15. 16.]
# [ 17. 18. 19.]]]
# 外側の軸と真ん中の軸を交換
print(ndarr1.swapaxes(0, 1))
# 出力結果
# [[[ 1. 2. 3.]
# [ 11. 12. 13.]]
#
# [[ 4. 5. 6.]
# [ 14. 15. 16.]]
#
# [[ 7. 8. 9.]
# [ 17. 18. 19.]]]
# 真ん中の軸と内側の軸を交換
print(ndarr1.swapaxes(1, 2))
# 出力結果
# [[[ 1. 4. 7.]
# [ 2. 5. 8.]
# [ 3. 6. 9.]]
#
# [[ 11. 14. 17.]
# [ 12. 15. 18.]
# [ 13. 16. 19.]]]
# 外側の軸と内側の軸を交換
print(ndarr1.swapaxes(0, 2))
# 出力結果
# [[[ 1. 11.]
# [ 4. 14.]
# [ 7. 17.]]
#
# [[ 2. 12.]
# [ 5. 15.]
# [ 8. 18.]]
#
# [[ 3. 13.]
# [ 6. 16.]
# [ 9. 19.]]]
pandasのDataFrameでの転置行列 2015/08/31
T
というメソッドはNumPyのndarrayだけでなく、pandasのDataFrameでもそのまま使える。
import pandas as pd
df1 = pd.DataFrame(
{'name': ['Danny', 'Jess', 'Joey', 'D.J.', 'Steph', 'Michelle'],
'age': [29, 24, 29, 10, 5, 0],
'sex': ['m', 'm', 'm', 'f', 'f', 'f']},
columns=['name', 'age', 'sex'])
print(df1)
# 出力結果
# name age sex
# 0 Danny 29 m
# 1 Jess 24 m
# 2 Joey 29 m
# 3 D.J. 10 f
# 4 Steph 5 f
# 5 Michelle 0 f
print(df1.T)
# 出力結果
# 0 1 2 3 4 5
# name Danny Jess Joey D.J. Steph Michelle
# age 29 24 29 10 5 0
# sex m m m f f f
DataFrameのT
メソッドは、NumPyのとは違って、結果を変更してももとのDataFrameを変更しないみたい。
df1.T[0]["age"] = 30
print(df1)
# 出力結果は最初のと変わらず