ユーニックス総合研究所

  • home
  • archives
  • python-numpy-append

NumPyのappend()の使い方: 配列の末尾に要素を追加

  • 作成日: 2020-10-13
  • 更新日: 2023-12-24
  • カテゴリ: Python

numpy.append()の使い方

PythonのNumPy(配列の演算を便利に行うライブラリ)には配列の末尾に要素を追加するnumpy.append()があります。
この関数を使うと配列の末尾に要素や配列を追加することが出来ます。

numpy.append()axisなどの引数を指定することで自由に配列に要素を追加できます。
配列に配列を追加したり、多次元配列に多次元配列を追加することも可能です。

numpy.append()の構造

numpy.append()は↓のような構造を持っています。
numpy.append()は最大で3つの引数を取り、1つの返り値を返します。

numpy.append(arr, values, axis=None)  

↓は引数と返り値の詳細です。

arr(第1引数)

値の追加先の配列です。
この配列は内部的にコピーされ、そのコピーされた配列に要素が追加されます。
第3引数のaxisによってコピーされた配列の形状は変化します。
詳しくは↓のaxisの項をご覧ください。

第1引数と第2引数の配列の次元数は同一である必要があります。

values(第2引数)

配列に追加する値を指定します。
この引数にはintfloat, str, listtupleなどのオブジェクトを渡せます。
第3引数のaxisが指定されていない場合はnumpy.append()はこの引数を適当な形に調整します。

第1引数と第2引数の配列の次元数は同一である必要があります。

axis(第3引数)

第3引数のaxisには0, 1などの整数を指定します。
このaxisを指定せずにnumpy.append()を呼び出した場合、numpy.append()は第1引数と第2引数をフラット化して実行します。
フラット化というのは、2次元配列などを1次元にするということです。

たとえば第1引数のarrが2次元配列で、第2引数のvaluesも2次元配列の場合、このaxisの指定は機能します。
axis0のとき、valuesarrの行に追加されます。
axis1のときは、valuesarrの列に追加されます。

返り値

返り値は、コピーされ要素が追加された配列(numpy.ndarray)です。

配列の末尾に整数を追加する

numpy.ndarrayの配列に整数3を追加します。
まずnumpy.array()で配列(numpy.ndarray)を作成します。
その配列を第1引数に指定し、追加したい整数3を第2引数に指定してnumpy.append()を呼び出します。
numpy.append()は第1引数の配列をコピーし、そのコピーした配列に第2引数の値を追加した後、返り値としてそのコピーした配列を返します。

import numpy as np  


arr = np.array([1, 2])  # 配列(numpy.ndarray)を作成  
result = np.append(arr, 3)  # 配列の末尾に要素3を追加  
print(result)  # 結果を出力  

出力結果。

[1 2 3]  

配列の末尾に配列を追加する

配列(list)をNumPyの配列(numpy.ndarray)に追加します。
numpy.append()の第2引数にlisttuple、またはnumpy.ndarrayなどの1次元配列を指定すると、numpy.append()はその配列内の要素を第1引数(コピー済み)の配列に追加します。

import numpy as np  


arr = np.array([1, 2])  # 配列を作成  
result = np.append(arr, [3, 4])  # 配列の末尾に配列を追加  
print(result)  # 結果を出力  

出力結果。

[1 2 3 4]  

2次元配列の末尾に配列を追加する(axis指定なし)

numpy.append()の呼び出しでaxisを指定しない場合、第1引数に指定した2次元配列はフラット化(1次元化)されます。
そのため2次元配列に1次元配列を追加する場合、まず2次元配列が1次元にフラット化されて、そのフラット化された1次元配列の末尾に、第2引数の1次元配列の要素が追加されます。

import numpy as np  


arr = np.array([[1, 2], [2, 2]])  # 配列を作成  
result = np.append(arr, [3, 2])  # 配列の末尾に配列を追加  
print(result)  # 結果を出力  

出力結果。

[1 2 2 2 3 2]  

2次元配列の末尾に配列を追加する?(axis指定あり)

第3引数のaxisを指定して2次元配列の末尾に配列を追加できるか実験します。
結論から言うと、できませんでした。
↓は2次元配列の行に配列を追加しようとしてエラーになっているところです。

import numpy as np  


arr = np.array([[1, 2], [2, 2]])  # 配列を作成  
result = np.append(arr, [3, 2], axis=0)  # 2次元配列の末尾に配列を追加  
print(result)  # 結果を出力  
ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 2 dimension(s) and the array at index 1 has 1 dimension(s)  

エラーメッセージを翻訳すると↓のような意味になります。

ValueError: 第1引数と第2引数の配列は同じ次元数でなければなりませんが、第1引数の配列は2次元、第2引数の配列は1次元です。

つまり、第1引数と第2引数の配列の次元数が違うよ!ってことですね。

2次元配列の末尾に2次元配列を追加する(axis指定なし)

第1引数と第2引数が2次元配列の場合も、axisが指定されていない場合は結果はフラット化され1次元配列になります。

import numpy as np  


arr = np.array([[1, 2], [2, 2]])  # 配列を作成  
result = np.append(arr, [[3, 2], [4, 2]])  # 2次元配列の末尾に2次元配列を追加  
print(result)  # 結果を出力  
[1 2 2 2 3 2 4 2]  

2次元配列の末尾に2次元配列を追加する(axis指定あり)

第1引数と第2引数が2次元配列の場合に、第3引数のaxis0を指定すると、第2引数の配列は第1引数の配列の行に追加されます。

import numpy as np  


arr = np.array([[1, 2], [2, 2]])  # 配列を作成  
result = np.append(arr, [[3, 2], [4, 2]], axis=0)  # 2次元配列の末尾に2次元配列を行として追加  
print(result)  # 結果を出力  

出力結果。

[[1 2]  
 [2 2]  
 [3 2]  
 [4 2]]  

また、axis1の場合は、第1引数の2次元配列の列に第2引数の2次元配列が追加されます。

import numpy as np  


arr = np.array([[1, 2], [2, 2]])  # 配列を作成  
result = np.append(arr, [[3, 2], [4, 2]], axis=1)  # 2次元配列の末尾に2次元配列を列として追加  
print(result)  # 結果を出力  

出力結果。

[[1 2 3 2]  
 [2 2 4 2]]  

結果を見るとわかりますが、第2引数の行に相当する要素が、第1引数の行の末尾に追加されてます。

配列の先頭に要素を追加する

numpy.append()は基本的には配列の末尾に要素を追加する関数ですが、第1引数と第2引数の順番を入れ替えることで配列の先頭に要素を追加することが出来ます。

import numpy as np  


arr = np.array([1, 2])  # 配列を作成  
result = np.append(3, arr)  # 配列の先頭に要素を追加する  
print(result)  # 結果を出力  

出力結果。

[3 1 2]  

ソースコードの解析

numpy.append()のコードは↓から見ることが出来ます。

コードを見るとnumpy.append()axisNoneの場合は第1引数と第2引数をフラット化しているのがわかります。

   if axis is None:  
        if arr.ndim != 1:  
            arr = arr.ravel()  # <- フラット化している  
        values = ravel(values)  # <- フラット化している  
        axis = arr.ndim-1  

内部では最終的にconcatenate関数が呼ばれています。

問題

Q1: numpy.append()の第1引数として適当なものを答えよ

  1. 配列
  2. dict

Q2: numpy.append()の第2引数として適当なものを答えよ

  1. 1次元配列
  2. 2次元配列
  3. None

Q3: numpy.append()の第3引数のaxis0を指定した場合の挙動を答えよ

  1. 第1引数の2次元配列の行に第2引数の2次元配列を追加する
  2. 第1引数の2次元配列の列に第2引数の2次元配列を追加する
  3. 第1引数の2次元配列の対角線に第2引数の2次元配列を追加する

問題の解答はこちら↓

Q1: 1, 2, 3
Q2: 1, 2, 3
Q3: 1