PythonはNumpyというライブラリの恩恵を多く受けていますが、たまにしか使わない処理は毎回忘れてしまいます。毎度調べながら作業するのは効率が悪いので、ここではNumpyの要素抽出や並べ替えといった処理をまとめておきます。
こんにちは。wat(@watlablog)です。必要なのに何かと忘れがちなNumpyの処理を備忘録としてまとめておきます!独断と偏見なのであしからず!
配列の作成
任意配列作成:np.array()
1D配列と2D配列はarray()で作成します。
1 2 3 4 5 6 7 8 9 10 11 12 |
import numpy as np # 1D配列の作成 a = np.array([1, 2, 3]) # 2D配列の作成 b = np.array([[1, 2, 3], [4, 5, 6]]) # shapeを確認 print(a.shape) print(b.shape) |
shapeは常に意識してコーディングした方が良いと思うのでshapeをprintしてみます。
1 2 |
(3,) (2, 3) |
ゼロ初期化配列の作成:np.zeros()
配列のshapeを引数に中身がゼロの配列を作成するためにはnp.zeros()を使います。ゼロ配列はプログラム上で初期化をする時に多用するので覚えときましょう。
1 2 3 4 5 6 7 8 9 10 11 |
import numpy as np # 1Dゼロ配列を作成 a = np.zeros(3) # 2Dゼロ配列を作成 b = np.zeros((3,2)) # 中身を確認 print('1D array=\n', a) print('2D array=\n', b) |
1Dや2D配列で作成したゼロ配列が以下です。
1 2 3 4 5 6 |
1D array= [0. 0. 0.] 2D array= [[0. 0.] [0. 0.] [0. 0.]] |
one初期化配列の作成:np.ones()
配列の中身が全て1になるnp.ones()もよく使います。使い方はnp.zeros()と同じです。
1 2 3 4 5 6 7 8 9 10 11 |
import numpy as np # 1Done配列を作成 a = np.ones(3) # 2Done配列を作成 b = np.ones((3,2)) # 中身を確認 print('1D array=\n', a) print('2D array=\n', b) |
結果はzerosの時と同じですね。
1 2 3 4 5 6 |
1D array= [1. 1. 1.] 2D array= [[1. 1.] [1. 1.] [1. 1.]] |
配列要素の抽出
要素を1つ抽出
Numpy配列(ndarray)で最も基本的な配列要素を1つだけ抽出する方法は以下のprint文の中に記載。とっても簡単。
1 2 3 4 5 6 7 |
import numpy as np # 1D配列を作成 a = np.array([0,1,2,3,4,5,6,7,8,9]) # 要素を抽出 print(a[1]) |
1D配列であればこのように結果が出力されます。
1 |
1 |
2次元なら[0,0]と行列のインデックスを指定してあげれば良い。
スライスで抽出
1D配列をスライス
Numpyはスライスという便利な機能があり、これは[start:stop:step]で開始指標、終了(何個目でストップか)、ステップ(何個飛ばしで抽出するか)でまとまった要素を抽出する事ができます。
以下は1D配列の場合の例。ここでは[0:5:1]と書きましたが、開始指標0とステップ1は省略可能なので[:5:]とも[:5]ともかけます。
1 2 3 4 5 6 7 |
import numpy as np # 1D配列を作成 a = np.array([0,1,2,3,4,5,6,7,8,9]) # スライス[start:stop:step] print(a[0:5:1]) |
以下のように抽出されました。
1 |
[0 1 2 3 4] |
2D配列の行列をスライスする
次は2D配列の場合です。百聞は一見にしかず、まずは以下のコードを実行してみましょう。
1 2 3 4 5 6 7 8 9 |
import numpy as np # 2D配列を作成 a = np.array([[1,2,3], [4,5,6], [7,8,9]]) # スライス各次元で[start:stop:step] print(a[:3,:3]) |
スライスの意味無いですが、以下の結果が出ました。これで全部抽出できます。
1 2 3 |
[[1 2 3] [4 5 6] [7 8 9]] |
以下のコードは各行、各列をスライスで抽出する例です。
1 2 3 4 5 |
# スライス各次元で[start:end:step] print(a[:1,::]) # 1行目まで抽出 print(a[:2,::]) # 2行目まで抽出 print(a[::,:1]) # 1列目まで抽出 print(a[::,:2]) # 2列目まで抽出 |
結果はこちら。使ってみればわかりますね。
1 2 3 4 5 6 7 8 9 10 11 |
[[1 2 3]] [[1 2 3] [4 5 6]] [[1] [4] [7]] [[1 2] [4 5] [7 8]] |
スライスで逆順にする
スライスのstep項目を-1にすると逆順に抽出する事ができます。
1 2 3 4 5 6 7 |
import numpy as np # 1D配列を作成 a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) # スライスで逆順にする print(a[::-1]) |
次の並べ替えの節の内容で昇順に並べ替えた配列をスライスで逆順にして降順に変換するといった技にも使えます。
1 |
[9 8 7 6 5 4 3 2 1 0] |
配列の並べ替え
昇順と降順にする:np.sort()
1D配列ソート
配列をソートする方法は大きい順に値を抽出したりする時に重宝します。
Numpyのnp.sort()を使うと並べ替え(ソート)が可能ですが、デフォルトでは昇順になります。降順にする場合は後ろに[::-1]を付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import numpy as np # 1D配列を作成 a = np.array([3,1,2,6,7,9,4,5,8]) # 昇順にソートする b = np.sort(a) # 降順にソートする c = np.sort(a)[::-1] # 中身を確認 print('original=\n', a) print('sorted(ascending order)=\n', b) print('sorted(descending order)=\n', c) |
以下が結果です。元の配列を昇順と降順にする事ができました。
1 2 3 4 5 6 |
original= [3 1 2 6 7 9 4 5 8] sorted(ascending order)= [1 2 3 4 5 6 7 8 9] sorted(descending order)= [9 8 7 6 5 4 3 2 1] |
2D配列ソート(行でソート)
2D配列の場合は少しやっかいです。np.sort()はデフォルトでは最終軸(shapeの最後要素:axis=-1)でソートされます。
以下はあえてaxis=-1を指定していますが、これは省略可能です。2D配列の降順の場合はaxis=-1の場合[:,::-1]を後ろに付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import numpy as np # 2D配列を作成 a = np.array([[5,1,6], [3,4,2]]) # 昇順にソートする b = np.sort(a, axis=-1) # 降順にソートする c = np.sort(a, axis=-1)[:,::-1] # 中身を確認 print('original=\n', a) print('sorted(ascending order)=\n', b) print('sorted(descending order)=\n', c) |
2D配列の場合はaxis=-1で各行にソートされます。
1 2 3 4 5 6 7 8 9 |
original= [[5 1 6] [3 4 2]] sorted(ascending order)= [[1 5 6] [2 3 4]] sorted(descending order)= [[6 5 1] [4 3 2]] |
2D配列ソート(列でソート)
列でソートする時はaxis=0を指定します。その場合、降順にする時は[::-1,:]を付けます。2Dの場合は要素が二つあるからカンマで区切るんですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import numpy as np # 2D配列を作成 a = np.array([[5,1,6], [3,4,2]]) # 昇順にソートする b = np.sort(a, axis=0) # 降順にソートする c = np.sort(a, axis=0)[::-1,:] # 中身を確認 print('original=\n', a) print('sorted(ascending order)=\n', b) print('sorted(descending order)=\n', c) |
結果は以下です。列方向でソートする事ができました。
1 2 3 4 5 6 7 8 9 |
original= [[5 1 6] [3 4 2]] sorted(ascending order)= [[3 1 2] [5 4 6]] sorted(descending order)= [[5 4 6] [3 1 2]] |
多次元配列になってもやり方は同じです。次元が増えた分だけaxisも増えていき、降順にする時のカンマの数も変わっています。
他配列を基準に別配列をソートする:np.argsort()
1D配列のargsort()
配列をソートする目的の一つに、ソートした配列と同じ順番で他の配列をソートしたい時があります。例えば、「Pythonで学ぶ信号処理!振幅変調のサイドバンドを観察してみる」ではピークと軸の数値を共に大きい順に取得する時に使いました。
以下のコードではa配列をソートした順番にb配列をソートするという事をしています。その際、np.argsort()を使っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import numpy as np # 1D配列を作成 a = np.array([3,1,2,6,7,9,4,5,8]) b = np.array([1,2,3,4,5,6,7,8,9]) # 昇順にソートする c = np.sort(a) # a配列のソート指標を取得する index_sort = np.argsort(a) # cの指標でbを並べ替える d = b[index_sort] # 中身を確認 print('original=\n', a) print('c=\n', c) print('d=\n', d) |
以下が結果です。これはわかりやすいですね。
1 2 3 4 5 6 |
original= [3 1 2 6 7 9 4 5 8] c= [1 2 3 4 5 6 7 8 9] d= [2 3 1 7 8 4 5 9 6] |
2D配列のargsort()
2Dの場合は結構やっかいです。np.argsort()は先ほどと同じように使います。しかし並べ替えはb[index_sort]ではやってくれず、1つずつ指定してあげる必要があります(d=の所)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import numpy as np # 2D配列を作成 a = np.array([[5,1,6], [3,4,2]]) b = np.array([[1,2,3], [3,4,5]]) # 昇順にソートする c = np.sort(a, axis=-1) # a配列のソート指標を取得する index_sort = np.argsort(a, axis=-1) # cの指標でbを並べ替える d = np.array([b[0,index_sort[0,:]],b[1,index_sort[1,:]]]) # 中身を確認 print('original=\n', a) print('c=\n', c) print('d=\n', d) |
以下が結果。このように書けば2Dの場合でも、他の配列を基準にした並べ替えが可能です。
1 2 3 4 5 6 7 8 9 |
original= [[5 1 6] [3 4 2]] c= [[1 5 6] [2 3 4]] d= [[2 1 3] [5 3 4]] |
まだまだこのページは未完成です!これからNumPyの便利技はここに一括でまとめていきます!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!