【NumPy入門】np.newaxis/Noneを使った配列への新しい次元の追加

この記事では、NumPyの配列(np.array)に新しい次元を追加する方法を紹介しています。

Nonenp.newaxisreshapeの3つの方法があります。

使いやすいと思ったものを選んで使ってみてください。

np.newaxisを使った次元の追加

np.newaxisは変数です。

つまりこれはNumPyの中に定義されたnewaxisという変数を使っているだけです。

この変数は、次元を追加したい配列があったときに、次元を追加したい場所にnp.newaxisをおいてスライス記法を使うだけです。

文章で書くと分かりづらいですね。サンプルコードを見てみましょう。

In [1]:
# ライブラリのimport
import numpy as np

# サンプル配列の作成
a = np.arange(0,10).reshape(2,-1)

# 確認
print("a:")
print(a)
print("a.shape:")
print(a.shape)
Out
a:
[[0 1 2 3 4]
 [5 6 7 8 9]]
a.shape:
(2, 5)

サンプル配列aに対して、新しい次元を追加していきます。

In [2]:
b = a[np.newaxis,:,:]

# 確認
print("b:")
print(b)
print("b.shape:")
print(b.shape)
Out
b:
[[[0 1 2 3 4]
  [5 6 7 8 9]]]
b.shape:
(1, 2, 5)

In[2]では、配列aの1次元目に新しい次元を追加しています。

コロン(:)はその次元の要素をすべて指定する書き方です。

同様にして、新しい次元を差し込む位置を変えてみましょう。

In [3]:
c = a[:,np.newaxis, :]

# 確認
print("c:")
print(c)
print("c.shape:")
print(c.shape)
Out
c:
[[[0 1 2 3 4]]

 [[5 6 7 8 9]]]
c.shape:
(2, 1, 5)
In [4]:
d = a[:,:,np.newaxis]

# 確認
print("d:")
print(d)
print("d.shape:")
print(d.shape)
Out
d:
[[[0]
  [1]
  [2]
  [3]
  [4]]

 [[5]
  [6]
  [7]
  [8]
  [9]]]
d.shape:
(2, 5, 1)

ちゃんと新しい次元が追加されてshapeが変わったかを確認するには、np.arrayのshapeというインスタンス変数を見てみることをおすすめします。

newaxisはNoneと等価

np.newaxis変数はNoneと同じものです。

なので以下の等式が成り立ちます。

In [5]:
np.newaxis == None
Out[5]:
True

従って今までの操作もNoneで代用でき、私の知っている限りだとNoneの方がよく使われている印象があります。

In [6]:
e = a[None, :,:] 
e.shape
Out[6]:
(1, 2, 5)

np.newaxisの方が何がしたい操作なのかわかりやすい、ということはあります。

ですが慣れてきたらNoneを使った方が楽だと思います。

reshapeを使った次元の追加

NumPy配列にはreshapeというメソッドがありました。

この機能を使えば要素数が同じであれば配列のshapeを変更する事ができます。

この機能を使ってnp.newaxisと同等の操作ができます。

In [7]:
a.reshape(1,2,5)
Out[7]:
array([[[0, 1, 2, 3, 4],
        [5, 6, 7, 8, 9]]])

使い勝手は同じなので、後は

  • 各次元の要素数を明示的に書かないといけない(reshape)
  • コロンで代用できる(np.newaxis, None)

の違いでしかないですね。

それぞれの実行速度は以下の通りです。

In [8]:
sample = np.arange(0,1000000).reshape(5,-1)

%time sample.reshape(5,200000,1)
%time sample[:,:,None]
Out
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 10.3 µs
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 8.58 µs

まとめ

この記事では、配列に新しい次元を追加する機能について紹介しました。

  • None/np.newaxisを使う
  • reshapeメソッドを使う

の二通りの方法があります。

個人的にはNoneを使う方法がオススメです。

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

フクロウ

フクロウ

第一言語はPythonです。
皆さんRustやりましょう。