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.newaxisNoneで代用することも可能ですが、コードの分かりやすさという面で次元を追加する場合には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を使ったほうがコードが読みやすく、簡潔になるのでこちらを使うほうがいいですね。

参考