HOWTO · NumPy
numpy.newaxisでNumPy配列に軸を追加する
numpy.newaxis を使用して、Python の NumPy 配列に新しい次元を追加できます。
このページの内容
numpy.newaxisは、インデックス式で使うと配列に長さ1の軸を追加します。既存の軸より前に置くと行になり、その軸の後に置くと列になります。形状が(4,)の1次元配列では、それぞれ(1, 4)と(4, 1)になります。元の値の順序は変わりません。インデックスによって軸が挿入され、配列の形状が変わります。
numpy.newaxisでNumPy配列に軸を追加する
NumPyのインデックスでは、numpy.newaxisはPythonのNoneオブジェクトの別名です。括弧を付けて呼び出すメソッドではありません。numpy.newaxisのドキュメントでは、このインデックス用の定数が説明されています。インデックスでarray[np.newaxis, :]と書くと新しい軸が先頭に置かれ、array[:, np.newaxis]と書くと既存の軸の後に置かれます。コロンは、既存の軸に沿ったすべての値を選択します。
NumPyをインストールした環境で、次の例を実行できます。
import numpy as np
values = np.array([1, 2, 3, 4])
print(values.shape)
row = values[np.newaxis, :]
column = values[:, np.newaxis]
print(row.shape)
print(column.shape)
(4,)
(1, 4)
(4, 1)
最初の形状は、4個の要素を持つ1つの軸を表します。行の形式では、挿入された先頭の軸の長さが1で、元の軸の長さは4のままです。列の形式では、長さ4の元の軸が先にあり、挿入された軸の長さが1になります。そのため形状はそれぞれ(1, 4)と(4, 1)です。形状の各値は軸の順序に沿って並び、値そのものが別のものになるわけではありません。また、形状が2次元になっても、データが特別な行列型になるわけではなく、NumPyでは引き続き配列として扱われます。
同じ2つのインデックスはNoneでも書けます。values[None, :]は行の形状を作り、values[:, None]は列の形状を作ります。周囲のコードで読みやすい方を選んでください。すでに複数の次元がある配列にもnumpy.newaxisで軸を追加できます。インデックス内の位置によって、結果の形状で長さ1の軸が置かれる位置が決まります。後続の処理で使う前に、インデックスの位置と形状を照らし合わせてください。
別の処理で次元をそろえる必要がある場合、軸の追加が役立ちます。ブロードキャストを使う処理もその一例です。追加した軸の長さは1なので、他の次元が適合すればブロードキャストによって拡張できます。ただし、軸を追加するだけで、どの配列同士も互換になるわけではありません。行と列のどちらにするかを決めるときは、まず結果の形状と、次の処理で必要な軸の順序を確認しましょう。そうすればインデックスの動きを把握しやすくなり、2つの形式が常に置き換え可能だと思い込まずに済みます。
形状が(2, 3)の配列では、matrix[:, :, None]は末尾に軸を追加して形状を(2, 3, 1)にし、matrix[None, :, :]は先頭に追加して(1, 2, 3)にします。どちらの場合も、元の2つの軸の順序と長さは保たれます。複数のインデックス位置を使うときは、元の形状を書き出し、各Noneまたはnumpy.newaxisがどこに現れるかを示すと、別の関数に配列を渡す前に新しい形状を予測できます。