はじめてのNumpy 4.次元操作

初めてのNumpy やり方 次元の操作 転置 軸の入れ替え

こんにちは。BOSSです。

はじめてのNumpyシリーズ第4回目です。

今回は

  • 次元の追加などの操作

  • arrayの転置

  • 軸の入れ替え

を学習していきます。

基本的にコンピューターで扱う数値演算は配列や行列で計算を行います。

そこで欠かすことのできない次元という物の考え方を理解していきましょう。

前回まで

はじめてのNumpy 1.アレイの作成と要素へアクセス
はじめてのNumpy 2.要素の取り出し
はじめてのNumpy 3.arrayの計算、arrayの大きさを変え方

次元の考え方

はじめにちょっと難しい話をします。

Numpyには配列(array)と行列(matrix)というオブジェクトがあります。

配列っていうのは複数要素を持つリスト型。
一次元の配列(リスト)っていうのは今までもよく取り上げてきました。

list = ["りんご", "ぶどう", "もも"]

みたいなやつですね。

配列は多次元に取ることができて一番イメージしやすいのが二次元の配列。

エクセルでつくる表みたいなイメージは容易かと思います。

あるいはもっと高次元の3次元、4次元と拡張できるのですが
ちょっとイメージしにくいですね。

これは樹形図的に考えたら分かりやすいのかなと思います。
多次元配列のイメージ 画像 樹形図

行列っていうのは線形代数的に言えばベクトルですね。
これは一般的には二次元の配列にあたります。

Numpyにおけるarrayとmatrixの違いは掛け算の挙動の違いなのですが

またそれはいずれ取り上げます。
端的に言えば要素同士の掛け算か内積かという違いです。

まぁ分からなくても大丈夫です。

今回とりあげるのは全てarrayであり、多次元配列を用います。
したがって、この多次元という感覚を持っていないと非常にしんどい。

わたしもこの感覚がなかなか理解できなくて、学習するときに結構理解まで時間がかかりました。

そういうこともあって、ちょっと難しい話でしたが最初にこの話をしておきました。

次元操作

多次元配列を一次元配列に

こんどは逆に 多次元 → 一次元 にしてみましょう。

.ravel()

を用いることでarrayの一次元化ができます。

5×5の0埋めarrayを作りましょう。

arr1 = np.zeros((10, 5), dtype = int)
print(arr1)
[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]

ではこのarr1を1次元化すると

print(arr1.rabel())
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

こうですね。25個並んでるか数えてみてください。

次元の追加

さて、次は次元を追加してみます。

これは直感的にはなかなか分かりにくいところ
なんですが、動かして理解していきましょう。

この節ではarrayの大きさを確認することで
次元がどうなっているのかをみていきます。

arrayの大きさは

np.shape

というメソッドで確認ができます。

まずは2×2のarrayを用意して.shapeメソッドの働きを確認します。

arr2 = np.zeros((2, 2), dtype=int)
print(arr2)
print(arr2.shape)
[[0 0]
 [0 0]]
(2, 2)

2×2の0埋めarrayが生成され、大きさは(2, 2)であると正しく表示されています。

次に今作ったarr2に次元を追加していきましょう。

np.expand_dims(array, axis=)

第一引数にarrayを指定、第二引数に次元を追加する位置を指定します。

これで指定したarrayにaxisで指定した軸に次元を一つ追加できます。
実際に動かしてみましょう。

arr2_1=np.expand_dims(arr3, axis=0)
print(arr2_1)
print(arr2_1.shape)

arr2の0次元目に次元を追加したものをarr2_1としています。
arrayを表示し、その次元の形を見てみます。

[[[0 0]
  [0 0]]]
(1, 2, 2)

こうなりました。

見た目ではわかりにくいですが、次元の形を確認してみると確かに0次元目に次元が追加されていることがわかります。

もう少し変えてみてみましょう。

arr2_2 = np.expand_dims(arr2, axis=1)
print(arr2_2)
print(arr2_2.shape)

こんどはarr2の1次元目に次元を追加してみました。すると

[[[0 0]]

 [[0 0]]]
(2, 1, 2)

確かに真ん中に一個次元が追加されていることがわかりますね。

次元の追加の仕方はこんな感じです。

サイズ1の次元の削除

多次元配列のイメージ画像 樹形図 この図を見れば

実際にはサイズが1の次元って意味がないことがわかります。

ということで、サイズが1の次元を一括して消す

ということも可能で、np.squeeze()を用います。

np.squeeze(array)

第一引数としてarrayを指定してあげます。

これで指定したarrayのなかにサイズ1の次元があれば削除できます。やってみましょう。

まずは大きさ1の次元を多目に持つarrayを作成します。

arr3 = np.empty((1, 1, 1, 1, 1, 1, 1, 1, 100, 1,1,1,1,10, 1), dtype=int)
print(arr3.shape)

np.emptyで各次元の大きさを指定して空のarrayを作成し、arr3とします。

作った通りなんですが一応大きさも確認しておくと

(1, 1, 1, 1, 1, 1, 1, 1, 100, 1, 1, 1, 1, 10, 1)

まぁこうなりますね。

ではnp.squeezeしてみましょう。

print(np.squeeze(arr3).shape)
(100, 10)

はい。大きさが1の次元は全て削除されました。

スッキリしましたね。

転置と軸操作

さて次元の操作を見てきましたが、次は転置と軸操作を見ていきましょう。

転置

arrayの転置の仕方を見ていきましょう。

転置は非常に簡単で

.Tメッソドを用いることでarrayを転置することができます。

実際に使ってみましょう。

arr4 = np.empty((2, 5))
print(arr4)
print(arr4.shape)

まずは2×5のarrayを用意します。こんな感じ。

[[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
(2, 5)

では.Tメソッドを使って転置しましょう。

print(arr4.T)
print(arr4.T.shape)
[[0 0]
 [0 0]
 [0 0]
 [0 0]
 [0 0]]
(5, 2)

はい。2×5の配列が5×2の配列になっていることが確認できますでしょうか?

arrayの転置ができるようになりました。

軸の入れ替え

最後に軸の入れ替えについて見ていきます。

すでに作られたarrayに関して、0次元目と3次元目を入れ替える

みたいな操作をする方法を学んでいきます。

使うのは

np.transpose(array, axes)

第一引数でarrayを指定、第二引数で入れ替える軸を指定していきます。

実際に使ってみましょう。まずは入れ替える用のarrayを作っていきましょう。

arr5 = np.empty((1, 2, 3))
print(arr5)
print(arr5.shape)

0次元目は大きさ1
1次元目は大きさ2
2次元目は大きさ3

のarrayです。

[[[0. 0. 0.]
  [0. 0. 0.]]]
(1, 2, 3)

arrayの大きさを確認してみると(1, 2, 3)のようになっていますね。

では今の並びから

0次元目→2次元目
1次元目→0次元目
2次元目→1次元目

という風に軸を入れ替えていきます。

arr5_1=np.transpose(arr5, (1, 2, 0))
print(arr5_1.shape)

このように軸の入れ替えを指定します。すると結果はこうなります。

(2, 3, 1)

これで軸の入れ替えが完了です。

各次元の大きさから思った通りの順番になっていることを確認してみてください。

まとめ

今回は盛りだくさんでしたが

  • 次元の操作

  • 転置のやり方

  • 軸の入れ替え

を学習していきました。次元の考え方はなれるまでは難しいのですが

なんとなく扱えるようにしていきましょう。