以前、一次元のNumpy配列(ndarray)に要素を追加する方法を紹介しました。
今回は、二次元以上のNumpy配列に要素を追加する方法を紹介していきます。
一次元の場合と大きな違いはありませんが、意識しなければいけないことが増えるので、その辺りも見ていきたいと思います。
とりあえずnp.append()はダメ?
ndarrayに要素を追加するにはnp.append()を用います。適当に二次元配列を作成して、末尾に要素を追加してみましょう。
import numpy as np
x = np.arange(8).reshape(2,4)
##[[0, 1, 2, 3],
##[4, 5, 6, 7]]
x_add = np.append(x,8)
##[0, 1, 2, 3, 4, 5, 6, 7, 8]
そのまま二次元配列に要素を追加しようとすると、一次元に戻したうえで要素を追加した配列が返されます。
これは二次元配列を追加しようとした場合も同様で、一次元に戻されたうえで結合されます。
x = np.arange(8).reshape(2,4)
##[[0, 1, 2, 3],
##[4, 5, 6, 7]]
y = np.arange(9, 17).reshape(2,4)
##[[ 9, 10, 11, 12],
##[13, 14, 15, 16]]
x_add = np.append(x,y)
##[ 0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16]
では、次元を保ったまま要素を追加するにはどうすればいいのでしょうか。
追加する軸を指定する
次元を保ったまま要素を追加するためには、軸(axis)を指定します。axis=0で新たな行を追加、axis=1で新たな列を追加します。
**行:縦方向 列:横方向
存在しない次元(例えば、二次元配列でaxis=2)を指定するとエラーになります。
x = np.arange(8).reshape(2,4)
##[[0, 1, 2, 3],
##[4, 5, 6, 7]]
y = np.arange(9, 17).reshape(2,4)
##[[ 9, 10, 11],
##[12, 13, 14]]
x_add = np.append(x,y,axis=0)
##[[ 0, 1, 2, 3],
##[ 4, 5, 6, 7],
##[ 9, 10, 11, 12],
##[13, 14, 15, 16]]
因みに、次元を保ったまま要素を追加する場合、元の配列の行列数と一致させる必要があります。
axis=0とした場合は配列の列数が、axis=1とした場合は配列の行数が一致している必要があります。一致していない場合はエラーになるので注意が必要です。
三次元の場合
三次元配列の場合も、次元を指定することで任意の方向に要素を追加することができます。
x = np.arange(8).reshape(2,2,2)
##[[[0, 1],
##[2, 3]],
##
##[[4, 5],
##[6, 7]]]
y = np.arange(9, 17).reshape(2,2,2)
##[[[ 9, 10],
##[11, 12]],
##
##[[13, 14],
##[15, 16]]]
x_add2 = np.append(x,y,axis=2)
##[[[ 0, 1, 9, 10],
##[ 2, 3, 11, 12]],
##
##[[ 4, 5, 13, 14],
##[ 6, 7, 15, 16]]]
x_add1 = np.append(x,y,axis=1)
##[[[ 0, 1],
##[ 2, 3],
##[ 9, 10],
##[11, 12]],
##
##[[ 4, 5],
##[ 6, 7],
##[13, 14],
##[15, 16]]]
x_add0 = np.append(x,y,axis=0)
##[[[ 0, 1],
##[ 2, 3]],
##
##[[ 4, 5],
##[ 6, 7]],
##
##[[ 9, 10],
##[11, 12]],
##
##[[13, 14],
##[15, 16]]]
まとめ
二次元以上のNumpy配列で要素を追加する方法を紹介しました。
要素を追加する際に、軸の方向と、配列の要素数が元の配列と一致しているかという点に注意する必要があります。
次元数が上がてくると、複雑に感じるかもしれませんが、1つ1つ整理して理解を進めてください^^
ではでは👋