NumPyの配列に次元を追加する方法は主に2つあります。np.newaxis
をスライシングに指定する方法とnp.reshape
を使う方法です。この2つを比較しながら、使い方を紹介します。
np.newaxis
を用いた方法
定数NumPy配列(ndarray)のスライシングにnp.newaxis
を指定する方法がよく使われます。この定数を使うことで、使われた次元に要素数1の新たな軸(axis)を追加することになります。np.newaxis
自体はNone
への参照です。
In [1]: import numpy as np
In [2]: np.newaxis is None
Out[2]: True
np.newaxis
をNone
で代用することも可能ですが、コードの分かりやすさという面で次元を追加する場合にはnp.newaxis
を使いましょう。
では、実際に次元を追加してみます。
In [1]: import numpy as np
In [2]: x = np.arange(15).reshape(3,5)
In [3]: x
Out[3]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
In [4]: x[np.newaxis, :, :] # 1つ次元を追加してスライシング。
Out[4]:
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]]])
In [5]: x[:, np.newaxis, :] # axis=1のところに入れることも可能。
Out[5]:
array([[[ 0, 1, 2, 3, 4]],
[[ 5, 6, 7, 8, 9]],
[[10, 11, 12, 13, 14]]])
In [6]: x[:, None, :] # Noneで代用も可能
Out[6]:
array([[[ 0, 1, 2, 3, 4]],
[[ 5, 6, 7, 8, 9]],
[[10, 11, 12, 13, 14]]])
In [7]: x = x.flatten()
In [8]: x # xを1次元配列に変換。
Out[8]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
In [9]: x[:, np.newaxis] # xを縦ベクトルに
Out[9]:
array([[ 0],
[ 1],
[ 2],
[ 3],
[ 4],
[ 5],
[ 6],
[ 7],
[ 8],
[ 9],
[10],
[11],
[12],
[13],
[14]])
np.reshape関数での代用
これらのやり方は、np.reshape
関数でも同様に行うことができます。np.reshape
関数については、以下の記事で詳しく解説をしていますので、参照してみてください。
配列を形状変換するNumPyのrehsapeの使い方 /features/numpy-reshape.html
In [10]: x = np.arange(15).reshape(3,5) # xを再び生成する。
In [11]: np.reshape(x, (1, 3, 5)) # x[np.newaxis, :,:]
Out[11]:
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]]])
In [12]: np.reshape(x, (3, 1, 5)) # x[:, np.newaxis, :]
Out[12]:
array([[[ 0, 1, 2, 3, 4]],
[[ 5, 6, 7, 8, 9]],
[[10, 11, 12, 13, 14]]])
In [13]: x = x.flatten() # 1次元配列に
In [14]: np.reshape(x, (-1, 1)) # x[:, np.newaxis]
Out[14]:
array([[ 0],
[ 1],
[ 2],
[ 3],
[ 4],
[ 5],
[ 6],
[ 7],
[ 8],
[ 9],
[10],
[11],
[12],
[13],
[14]])
両者の比較
両者の違いとして言えるのは、1つめに、np.newaxis
を使って次元を追加するのは、元の配列の各々の次元における要素数がわからなくても実行が可能だということです。
np.reshape
は1つの次元だけわからないときは-1
を使って自動調整をNumPyに任せることができますが、np.reshape(x, (-1, -1, 1))
のように-1
を2回使うとエラーが返ってきてしまいます。
配列の形状変更が可能なのは、reshape
の方なので、次元を追加するに加えて、要素の並べ方を指定したいときはこちらを使いましょう。単に次元を追加したい場合は、np.newaxis
を使ったほうがコードが読みやすく、簡潔になるのでこちらを使うほうがいいですね。