【NumPy入門 np.append】配列末尾に要素を追加するappend関数

Pythonのlistに要素を追加するメソッドに、appendがありました。

これに対応するNumPyの関数、np.append関数を紹介します。listのappendはメソッドでしたが、np.arrayのappendは関数です。同じような動作をする機能ですが、「np.appendは配列(np.array/list)自体を変更しない」という明確な違いがあります。

このあたりに注意してnp.appendの使い方を見ていきましょう。

目次

np.appendの引数と返り値

参考:SciPy.org

numpy.append(arrvaluesaxis=None)[source]配列の最後に値を追加します。

Parameters:
arr : array_like配列のような値(np.arary, listなど)

arrの末尾に値を追加した配列を生成します。

arr自体は変更されない事に注意。

values : array_like

valuesはarrのコピーに追加されます。arrと同じ形状でないとエラー。

axis : int, オプションなのでなくても一応OK。
          valuesが追加されるコピーarrの軸を指定します。
Returns:
append : ndarray

valuesが追加されたarrのコピーが出力されます。

使い方

これ以降のコードはjupyterを使って実行してください。

まずはNumPyをimportします。

In [1]:
import numpy as np

np.appendの基本的な使い方

axisのことは一旦忘れて、まずは簡単な使い方を確認してみましょう。まずはサンプル配列を作っておきます。

In [2]:
x = np.zeros(10)
x
Out[2]:
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

Pythonのappendはlist型のメソッドとして実装されていました。これに対して、NumPyのappendは関数として実装されているので注意が必要です。

In [3]:
np.append(x, 10)
Out[3]:
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 10.])

appendは非破壊の関数なので、x自体は変わっていないことにも注意。

In [4]:
x
Out[4]:
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
なので実際に使うときはy = np.append(x,10)のように、返り値を受け取る変数を用意して下さい。

また、np.arrayだけでなく、listなどの配列っぽい型も受け取ることができます。

In [5]:
x2 = list(x)
x2
Out[5]:
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
append関数の返り値x3には10が追加された配列が入っています。
In [6]:
x3 = np.append(x2, 10)
x3
Out[6]:
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., 10.])
これに対して、x2自体は変更されていません。
In [7]:
x2
Out[7]:
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

axisを使って多次元配列に要素追加

まずは解説用にサンプル配列を作っておきます。

In [8]:

x4 = np.zeros((2,3))
x4
Out[8]:
array([[0., 0., 0.],
       [0., 0., 0.]])

axis=0:多次元配列に配列を追加

axis=0は、valuesを配列として、多次元配列に追加してくれます。第一引数と第二引数の次元数や要素数が揃っていれば、多次元配列にも要素を追加する事ができます。

In [9]:
np.append(x4, np.array([[1,2,3]]), axis=0)
Out[9]:
array([[0., 0., 0.],
       [0., 0., 0.],
       [1., 2., 3.]])
In [10]:
x4.shape
Out[10]:
(2, 3)
In [11]:
np.array([[1,2,3]]).shape
Out[11]:
(1, 3)

また、引数に渡すのはarray_likeなオブジェクトであればいいので、listでも問題なく動作します。

In [12]:
np.append(x4, [[10,20,30]], axis=0)
Out[12]:
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [10., 20., 30.]])

ですが、次元数が異なる場合や、要素数が異なる場合はValueErrorが起こり失敗するので注意です。

In [13]:
np.append(x4, [10,20,30], axis=0)

[Error]

ValueError                                Traceback (most recent call last)
<ipython-input-13-373a71685d22> in <module>()
----> 1 np.append(x4, [10,20,30], axis=0)

~/anaconda3/lib/python3.6/site-packages/numpy/lib/function_base.py in append(arr, values, axis)
   4526         values = ravel(values)
   4527         axis = arr.ndim-1
-> 4528     return concatenate((arr, values), axis=axis)

ValueError: all the input arrays must have same number of dimensions
In [14]:
np.append(x4, [[10,20]], axis=0)
[Error]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-14-064157bb8bb6> in <module>()
----> 1 np.append(x4, [[10,20]], axis=0)

~/anaconda3/lib/python3.6/site-packages/numpy/lib/function_base.py in append(arr, values, axis)
   4526         values = ravel(values)
   4527         axis = arr.ndim-1
-> 4528     return concatenate((arr, values), axis=axis)

ValueError: all the input array dimensions except for the concatenation axis must match exactly

axis=1:多次元配列内のすべての配列に要素を追加

axis=1は、valuesを各配列の要素として、多次元配列に追加してくれます。

操作はaxis=0のときと同様です。

In [15]:
np.append(x4, np.array([[1],[2]]), axis=1)
Out[15]:
array([[0., 0., 0., 1.],
       [0., 0., 0., 2.]])
In [16]:
np.append(x4, [[5],[10]], axis=1)
Out[16]:
array([[ 0.,  0.,  0.,  5.],
       [ 0.,  0.,  0., 10.]])

axis=0のときと同じく、次元数と要素数に注意しましょう。

In [17]:

np.append(x4, np.array([1,2]), axis=1)

[Error]

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-eaf09d123d8d> in <module>()
----> 1 np.append(x4, np.array([1,2]), axis=1)

~/anaconda3/lib/python3.6/site-packages/numpy/lib/function_base.py in append(arr, values, axis)
   4526         values = ravel(values)
   4527         axis = arr.ndim-1
-> 4528     return concatenate((arr, values), axis=axis)

ValueError: all the input arrays must have same number of dimensions
In [18]:
np.append(x4, np.array([[1,2,3]]), axis=1)
[Error]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-18-29a816712190> in <module>()
----> 1 np.append(x4, np.array([[1,2,3]]), axis=1)

~/anaconda3/lib/python3.6/site-packages/numpy/lib/function_base.py in append(arr, values, axis)
   4526         values = ravel(values)
   4527         axis = arr.ndim-1
-> 4528     return concatenate((arr, values), axis=axis)

ValueError: all the input array dimensions except for the concatenation axis must match exactly

まとめ

この記事ではnp.appendについて紹介しました。np.appendは毎回配列を作り直すため、実は結構遅い関数として知られています。

ですが多次元配列に直接値を代入できるなどの便利な機能を持っているので、ぜひ覚えておきたい関数です。この記事でしっかり覚えて使いこなしてくださいね。

今回の記事は下記の記事を参考にしています。
参考記事:

この記事を書いた人

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

目次