numpy.append – 配列の末尾へ要素を追加する方法

numpy.appendは、配列の末尾に任意の要素を追加したい時に使う関数です。2次元配列の場合は行・列のどれをお追加するか、3次元配列の場合は奥行き・行・列のどれを追加するかなどを指定する必要があります。

実際のコードを見て確認していきましょう。

目次

1. numpy.appendの使い方

まずは基本的な書き方を確認しましょう。

numpy.append

書き方:

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

パラメーター:

引数   解説
arr array_like ここに指定した配列に要素を追加します(元の配列は変化しません)。
values array_like ここに指定した要素または配列が、上の配列に追加されます。
axis(optional)  int 要素を行に追加する軸を指定します。2次元以上の配列への要素の追加で、これを指定しない場合、戻り値は1次元配列になります。

戻り値: 

要素を追加したndarray

一緒に確認したい関数:

  • insert: 配列に要素を挿入
  • delete: 配列から要素を削除

実際のコードで確認していきましょう。

1.1. 1次元配列に要素を追加する

以下のコードでは、配列arr1に要素を追加した新しい配列arr2を生成しています。なお、np.arangeは『numpy.arange – 色々な連番の配列を生成する方法』で解説しています。

In [1]:
import numpy as np
#  元の配列を生成
arr1 = np.arange(1, 6)
#  arr1の末尾に要素を追加したarr2を生成
arr2 = np.append(arr1, [10, 20, 30, 40, 50])

#  確認
print('arr1: 元の配列\n', arr1, '\n')
print('arr2: 要素を追加した新しい配列を生成\n', arr2)
arr1: 元の配列
 [1 2 3 4 5] 

arr2: 要素を追加した新しい配列を生成
 [ 1  2  3  4  5 10 20 30 40 50]

ご覧のように、元の配列arr1が変更されるのではなく、新しい配列を生成する点をご確認ください。

第一引数と第二引数に渡すデータの型はarray_likeオブジェクトなので、以下のようにリストやタプルを渡しても構いません。

In [2]:
#  第一引数と第二引数に渡すデータはリストやタプルでも可能です。
list = [100, 200, 300]
tuple = (1, 2, 3)
arr3 = np.append(list, tuple)
arr3
Out[2]:
array([100, 200, 300,   1,   2,   3])

1.2. 2次元配列に要素を追加する

続いて、2次元配列に要素を追加する場合を見ていきましょう。

この場合、オプション引数axis=を指定しない場合は、一次元配列で戻ってきます。axis=0の場合は行を追加し、axis=1の場合は列を追加します。

それぞれ確認していきましょう。

1.2.1. axis=を指定しない場合は1次元配列で戻ってくる

まず、2次元以上の配列に要素を追加する場合でも、第三引数の「axis=」を指定しない場合は、1次元配列として戻されます。

以下のコードで実際に確認しておきましょう。

なお、コード内のreshapeメソッドについては『numpy.reshape – 配列の形状を変換』で解説しています。

In [3]:
import numpy as np
#  2次元配列を生成。
arr4 = np.arange(1, 13).reshape(3, 4)
#  2次元配列に要素を追加(axisを指定しない)
arr5 = np.append(arr4, [13, 14, 15, 16])

print('arr4: 元の配列\n', arr4, '\n')
print('arr5: axisを指定しない場合は1次元配列で生成\n', arr5)
arr4: 元の配列
 [[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]] 

arr5: axisを指定しない場合は1次元配列で生成
 [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16]

元の配列が2次元以上であっても同じく、1次元配列で戻ってきます。

1.2.2. axis=0で行(横軸)を追加

axis=0を指定すると、行(横軸)を追加します。以下のコードでご確認ください。

In [4]:
arr6 = np.append(arr4, [[13, 14, 15, 16]], axis=0)

print('arr4: 元の配列\n', arr4, '\n')
print('arr6: np.append(arr4, [[13, 14, 15, 16]], axis=0)\n', arr6, '\n')
arr4: 元の配列
 [[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]] 

arr6: np.append(arr4, [[13, 14, 15, 16]], axis=0)
 [[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [13 14 15 16]] 

要素数が合わない配列を追加しようとするとエラーになります。

In [5]:
'''  元の配列の追加する配列の要素数が異なる場合はエラー  '''
#  要素数4の配列に、要素数3の配列の行を追加することはできない。
arr6 = np.append(arr4, [[13, 14, 15]], axis=0)
ValueError: all the input array dimensions except for the concatenation axis must match exactly

行の要素数が同じであれば、2次元配に別の2次元配列を追加することもできます。

In [6]:
'''  2次元配列に2次元配列を追加  '''
arr7 = np.arange(0.1, 0.9, 0.1).reshape(2, 4)
arr8 = np.append(arr4, arr7, axis=0)

print('arr4: 元の配列\n', arr4, '\n')
print('arr7: 追加する配列\n', arr7, '\n')
print('arr8: 新しい配列 np.append(arr4, arr7, axis=0)\n', arr8)
arr4: 元の配列
 [[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]] 

arr7: 追加する配列
 [[0.1 0.2 0.3 0.4]
 [0.5 0.6 0.7 0.8]] 

arr8: 新しい配列 np.append(arr4, arr7, axis=0)
 [[ 1.   2.   3.   4. ]
 [ 5.   6.   7.   8. ]
 [ 9.  10.  11.  12. ]
 [ 0.1  0.2  0.3  0.4]
 [ 0.5  0.6  0.7  0.8]]

1.2.3. axis=1で列(縦軸)を追加

axis=1を指定すると、列(縦軸)を追加します。以下のコードで実際に確認しましょう。

In [7]:
arr9 = np.arange(6).reshape(3, 2)
#  末尾に列(縦軸)を追加。
arr10 = np.append(arr9, [[10], [10], [10]], axis=1)
#  それぞれの行の末尾に異なる要素を追加
arr11 = np.append(arr9, [[10], [20], [30]], axis=1)

print('arr9: 元の配列\n', arr9, '\n')
print('arr10: np.append(arr9, [[10], [10], [10]], axis=1)\n', arr10, '\n')
print('arr11: np.append(arr9, [[10], [20], [30]], axis=1)\n', arr11)
arr9: 元の配列
 [[0 1]
 [2 3]
 [4 5]] 

arr10: np.append(arr9, [[10], [10], [10]], axis=1)
 [[ 0  1 10]
 [ 2  3 10]
 [ 4  5 10]] 

arr11: np.append(arr9, [[10], [20], [30]], axis=1)
 [[ 0  1 10]
 [ 2  3 20]
 [ 4  5 30]]

このように、追加する要素は、行ごとに個別に指定することができます。

なお、追加する要素の次元数(角括弧の書き方)が一致していなければエラーになります。

In [8]:
#  追加する要素の次元が異なるとエラーになります。
arr12 = np.append(arr9, [10, 20, 30], axis=1)
ValueError: all the input arrays must have same number of dimensions

行の数が同じであれば、以下のコードのように、2次元配列に別の2次元配列を追加することもできます。

In [9]:
#  2次元配列に2次元配列を追加
arr13 = np.arange(0.1, 0.61, 0.1).reshape(3, 2)
arr14 = np.append(arr9, arr13, axis=1)

print('arr9: 元の配列\n', arr9, '\n')
print('arr13: 追加する配列\n', arr13, '\n')
print('arr14: np.append(arr9, arr13, axis=1)\n', arr14 )
arr9: 元の配列
 [[0 1]
 [2 3]
 [4 5]] 

arr13: 追加する配列
 [[0.1 0.2]
 [0.3 0.4]
 [0.5 0.6]] 

arr14: np.append(arr9, arr13, axis=1)
 [[0.  1.  0.1 0.2]
 [2.  3.  0.3 0.4]
 [4.  5.  0.5 0.6]]

1.3. 3次元配列同士の場合

3次元配列以上で使う場合は少ないと思いますが、一応見ておきましょう。

配列の次元が増えていくと、軸の数も増えていきます。3次元配列の場合は、0は奥行き、1は行(横軸)、2は列(縦軸)になります。参考に、以下のコードを貼っておきます。

In [10]:
'''  3次元配列同士  '''
arr14 = np.arange(12).reshape(3, 2, 2)
arr15 = np.arange(13, 25).reshape(3, 2, 2)
arr16 = np.append(arr14, arr15, axis=0)
arr17 = np.append(arr14, arr15, axis=1)
arr18 = np.append(arr14, arr15, axis=2)

print('arr14: 元の3次元配列\n', arr14, '\n')
print('arr15: 追加する3次元配列\n', arr15, '\n')
print('arr16: axis=0で奥行きを追加。np.append(arr14, arr15, axis=0)\n', arr16, '\n')
print('arr17: axis=1で行を追加。np.append(arr14, arr15, axis=1)\n', arr17, '\n')
print('arr18: axis=2で列を追加。np.append(arr14, arr15, axis=2)\n', arr18)
arr14: 元の3次元配列
 [[[ 0  1]
  [ 2  3]]

 [[ 4  5]
  [ 6  7]]

 [[ 8  9]
  [10 11]]] 

arr15: 追加する3次元配列
 [[[13 14]
  [15 16]]

 [[17 18]
  [19 20]]

 [[21 22]
  [23 24]]] 

arr16: axis=0で奥行きを追加。np.append(arr14, arr15, axis=0)
 [[[ 0  1]
  [ 2  3]]

 [[ 4  5]
  [ 6  7]]

 [[ 8  9]
  [10 11]]

 [[13 14]
  [15 16]]

 [[17 18]
  [19 20]]

 [[21 22]
  [23 24]]] 

arr17: axis=1で行を追加。np.append(arr14, arr15, axis=1)
 [[[ 0  1]
  [ 2  3]
  [13 14]
  [15 16]]

 [[ 4  5]
  [ 6  7]
  [17 18]
  [19 20]]

 [[ 8  9]
  [10 11]
  [21 22]
  [23 24]]] 

arr18: axis=2で列を追加。np.append(arr14, arr15, axis=2)
 [[[ 0  1 13 14]
  [ 2  3 15 16]]

 [[ 4  5 17 18]
  [ 6  7 19 20]]

 [[ 8  9 21 22]
  [10 11 23 24]]]

2. まとめ

numpy.append関数の使い方は以上の通りです。

1次元配列か、2次元以上の配列かで書き方が異なります。特にaxisの指定は最初は戸惑うかもしれません。実際にコードを書いていると、自然とスムーズに使えるようになりますので、そうなるまで手を動かしていきましょう。

また、以下の関数も一緒に学習しておくと良いでしょう。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる