Pythonのlistに要素を追加するメソッドに、appendがありました。
【Python入門】appendの使い方まとめ
更新日:2024年5月6日
これに対応するNumPyの関数、np.append関数を紹介します。listのappendはメソッドでしたが、np.arrayのappendは関数です。同じような動作をする機能ですが、「np.appendは配列(np.array/list)自体を変更しない」という明確な違いがあります。
このあたりに注意してnp.appendの使い方を見ていきましょう。
目次
np.appendの引数と返り値
参考:SciPy.org
numpy.
append
(arr, values, axis=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を使って実行してください。
np.appendの基本的な使い方
axisのことは一旦忘れて、まずは簡単な使い方を確認してみましょう。まずはサンプル配列を作っておきます。
Out[2]:
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
Pythonのappendはlist型のメソッドとして実装されていました。これに対して、NumPyのappendは関数として実装されているので注意が必要です。
Out[3]:
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 10.])
appendは非破壊の関数なので、x自体は変わっていないことにも注意。
Out[4]:
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
なので実際に使うときはy = np.append(x,10)のように、返り値を受け取る変数を用意して下さい。
また、np.arrayだけでなく、listなどの配列っぽい型も受け取ることができます。
Out[5]:
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
Out[6]:
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 10.])
Out[7]:
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
axisを使って多次元配列に要素追加
まずは解説用にサンプル配列を作っておきます。
Out[8]:
array([[0., 0., 0.],
[0., 0., 0.]])
axis=0:多次元配列に配列を追加
axis=0は、valuesを配列として、多次元配列に追加してくれます。第一引数と第二引数の次元数や要素数が揃っていれば、多次元配列にも要素を追加する事ができます。
Out[9]:
array([[0., 0., 0.],
[0., 0., 0.],
[1., 2., 3.]])
また、引数に渡すのはarray_likeなオブジェクトであればいいので、listでも問題なく動作します。
Out[12]:
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[10., 20., 30.]])
ですが、次元数が異なる場合や、要素数が異なる場合はValueErrorが起こり失敗するので注意です。
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
[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を各配列の要素として、多次元配列に追加してくれます。
Out[15]:
array([[0., 0., 0., 1.],
[0., 0., 0., 2.]])
Out[16]:
array([[ 0., 0., 0., 5.],
[ 0., 0., 0., 10.]])
axis=0のときと同じく、次元数と要素数に注意しましょう。
---------------------------------------------------------------------------
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
[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は毎回配列を作り直すため、実は結構遅い関数として知られています。
ですが多次元配列に直接値を代入できるなどの便利な機能を持っているので、ぜひ覚えておきたい関数です。この記事でしっかり覚えて使いこなしてくださいね。
今回の記事は下記の記事を参考にしています。
参考記事: