この記事では、NumPyの配列(np.array)に新しい次元を追加する方法を紹介しています。
None、np.newaxis、reshapeの3つの方法があります。
使いやすいと思ったものを選んで使ってみてください。
np.newaxisを使った次元の追加
np.newaxisは変数です。
つまりこれはNumPyの中に定義されたnewaxisという変数を使っているだけです。
この変数は、次元を追加したい配列があったときに、次元を追加したい場所にnp.newaxisをおいてスライス記法を使うだけです。
文章で書くと分かりづらいですね。サンプルコードを見てみましょう。
# ライブラリのimport
import numpy as np
# サンプル配列の作成
a = np.arange(0,10).reshape(2,-1)
# 確認
print("a:")
print(a)
print("a.shape:")
print(a.shape)
サンプル配列aに対して、新しい次元を追加していきます。
b = a[np.newaxis,:,:]
# 確認
print("b:")
print(b)
print("b.shape:")
print(b.shape)
In[2]では、配列aの1次元目に新しい次元を追加しています。
コロン(:)はその次元の要素をすべて指定する書き方です。
同様にして、新しい次元を差し込む位置を変えてみましょう。
c = a[:,np.newaxis, :]
# 確認
print("c:")
print(c)
print("c.shape:")
print(c.shape)
d = a[:,:,np.newaxis]
# 確認
print("d:")
print(d)
print("d.shape:")
print(d.shape)
ちゃんと新しい次元が追加されてshapeが変わったかを確認するには、np.arrayのshapeというインスタンス変数を見てみることをおすすめします。
newaxisはNoneと等価
np.newaxis変数はNoneと同じものです。
なので以下の等式が成り立ちます。
np.newaxis == None
従って今までの操作もNoneで代用でき、私の知っている限りだとNoneの方がよく使われている印象があります。
e = a[None, :,:]
e.shape
np.newaxisの方が何がしたい操作なのかわかりやすい、ということはあります。
ですが慣れてきたらNoneを使った方が楽だと思います。
reshapeを使った次元の追加
NumPy配列にはreshapeというメソッドがありました。
この機能を使えば要素数が同じであれば配列のshapeを変更する事ができます。
この機能を使ってnp.newaxisと同等の操作ができます。
a.reshape(1,2,5)
使い勝手は同じなので、後は
- 各次元の要素数を明示的に書かないといけない(reshape)
- コロンで代用できる(np.newaxis, None)
の違いでしかないですね。
それぞれの実行速度は以下の通りです。
sample = np.arange(0,1000000).reshape(5,-1)
%time sample.reshape(5,200000,1)
%time sample[:,:,None]
まとめ
この記事では、配列に新しい次元を追加する機能について紹介しました。
- None/np.newaxisを使う
- reshapeメソッドを使う
の二通りの方法があります。
個人的にはNoneを使う方法がオススメです。