numpyとlistでの転置行列の作り方をそれぞれ紹介していくぜ。
Numpyで転置
numpyで転置するには3つの方法がある。
numpy.ndarray.T
numpy.ndarray.transpose()
numpy.transpose()
である。
といっても、3つともほとんど同じように動作するのでどれを使ってもあまり違いはないと思う。
numpy.ndarray.T
数学での転置の記号もTなので、コードとしてはこの方法が一番見やすい気がする。(個人的な意見)
使い方もめちゃくちゃ簡単でこれだけ
import numpy as np
A = np.asarray([[1, 2, 3],
[4, 5, 6]])
print(A.T)
# [[1, 4]
# [2, 5]
# [3, 6]]
しかし、使う上で2つ注意点がある。
(どちらもドキュメントに書いてあります。注意としてではありませんが…)
1つ目はTが元の配列のビュー(参照)であるので、A.Tもしくは元の配列を変更すると互いに影響があること。
2つ目は1次元の配列に適用してもそのまま返ってくること。
これは1次元配列を転置したとしても同じベクトルになるからのようです。
For a 1-D array this has no effect, as a transposed vector is simply the same vector.
https://numpy.org/doc/stable/reference/generated/numpy.ndarray.transpose.html#numpy.ndarray.transpose
1つ目の注意を確認するコード。
確かに影響している。
A = np.asarray([[1, 2, 3],
[4, 5, 6]])
B = A.T
#転置後を変更
B[0][0]=32
print(A)
# [[32 2 3]
# [ 4 5 6]]
#元の配列を変更
A[0][1] = 100
print(B)
# [[ 32 4]
# [100 5]
# [ 3 6]]
2つ目の注意点のコード。
1次元であればそのまま返ってくるが、
あくまでも2次元の体を成していればうまく転置はできる。
A = np.asarray([1, 2, 3])
print(A.shape)
# (3,)
print(A.T)
# [1 2 3]
B = np.asarray([[1, 2, 3]])
print(B.shape)
# (1, 3)
print(B.T)
# [[1]
# [2]
# [3]]
numpy.ndarray.transpose()
numpy.ndarray.T
と同じ動作をする。
注意点もnumpy.ndarray.T
と同じ。
A = np.asarray([[1, 2 ,3],
[4, 5, 6]])
print(A.transpose())
# [[1 4]
# [2 5]
# [3 6]]
numpy.transpose()
これもnumpy.ndarray.transpose()
と同じ。
注意点もまた同じ。
A = np.asarray([[1, 2 ,3],
[4, 5, 6]])
print(np.transpose(A))
# [[1 4]
# [2 5]
# [3 6]]
listで転置
2次元リストで転置するにはzip()
を使うと簡潔にかける。
numpyに変換してnumpyの方法でもできるが、せっかくなのでlistだけでやってみる。
matrix = [[1, 2, 3, 4],
[5, 6, 7, 8]]
print(list(map(list, zip(*matrix))))
# [[1, 5], [2, 6], [3, 7], [4, 8]]
zip()の動作はこちらをご覧ください。
*でアンパックしているのは、そもそもそれをしないとzip()に渡すことができないから。
mapでlist()を適用しているのはそれをしなければ[ (), (), ()]
のような形になってしまうので、中身もlistにするために適用している。
仕組みとしてはこんな感じ(mapや*, listは省略)

参考

コメント