Numpy tutorial:np.insertとnp.concatenate

numpy tutorialの一環として、このサイトを参考にしてnumpy.insert, numpy.concatenateの使い方を調べてみる。

スポンサーリンク

numpy.insert

np.insertの説明は以下のように書いてある。

“Insert values along the given axis before the given indices”
所与のインデックスの前に所与の軸に沿った値を挿入する。

import numpy as np
a = np.array([[1, 2], [3, 4], [5, 6]])
a
array([[1, 2],
       [3, 4],
       [5, 6]])
# 軸指定が無い場合行列を平坦化して5を
# インデックス1の2の前に挿入する
np.insert(a, 1, 5)
array([1, 5, 2, 3, 4, 5, 6])
# 軸指定が無い場合行列を平坦化して7を
# インデックス3の4の前に挿入する
np.insert(a, 3, 7)
array([1, 2, 3, 7, 4, 5, 6])
# 指定軸1(列)に沿って5を
# インデックス1の前に挿入する
np.insert(a, 1, 5, axis=1)
array([[1, 5, 2],
       [3, 5, 4],
       [5, 5, 6]])
# 指定軸0(行)に沿って5を
# インデックス1の前に挿入する
np.insert(a, 1, 5, axis=0)
array([[1, 2],
       [5, 5],
       [3, 4],
       [5, 6]])

軸0を指定すると行が挿入される。

# インデックス5の6の前に8を
# インデックス6の前、あるいは
# (インデックス5の6の後)に9を挿入する
np.insert(a, [5, 6], [8, 9])
array([1, 2, 3, 4, 5, 8, 6, 9])
# インデックス2の3の前に5
# インデックス4の4の前に6を挿入する
np.insert(a, slice(2, 4), [5, 6])
array([1, 2, 5, 3, 6, 4, 5, 6])
# 列のインデックス1の[2,4,6]の前に
# [1,2,3]を挿入する。
np.insert(a, [1], [[1],[2],[3]], axis=1)
array([[1, 1, 2],
       [3, 2, 4],
       [5, 3, 6]])
# 行のインデックス1の[3,4]の前に
# [1,1],[2,2],[3,3]を挿入する。
np.insert(a, [1], [[1],[2],[3]], axis=0)
array([[1, 2],
       [1, 1],
       [2, 2],
       [3, 3],
       [3, 4],
       [5, 6]])
# インデックス2の3の前に7を
# インデックス2の3の前にfalse(0)を挿入する
np.insert(a, [2, 2], [7.13, False]) # type casting
array([1, 2, 7, 0, 3, 4, 5, 6])
# インデックス2の3の前に7を
# インデックス2の3の前にTrue(1)を挿入する
np.insert(a, [2, 2], [7.13, True]) # type casting
array([1, 2, 7, 1, 3, 4, 5, 6])
a = a.astype(np.float32)
np.insert(a, [2, 2], [7.13, True])
array([1.  , 2.  , 7.13, 1.  , 3.  , 4.  , 5.  , 6.  ], dtype=float32)

numpy.concatenate

numpy.concatenateの説明は以下のように書いてある。

“Join a sequence of arrays along an existing axis.”
既存の軸沿いに一連の配列をくっつける。

# a[1,2],[3,4]とb[5,6]を
# 行でくっつける 
a = np.array([[1,2],[3,4]])
b = np.array([[5,6]])
print(a.shape,b.shape)
np.concatenate((a,b),axis=0)
(2, 2) (1, 2)
array([[1, 2],
       [3, 4],
       [5, 6]])
# axisを指定しなくてもいける
np.concatenate((a, b))
array([[1, 2],
       [3, 4],
       [5, 6]])
np.concatenate((a,b),axis=1)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-54-644816af0704> in <module>()
----> 1 np.concatenate((a,b),axis=1)

ValueError: all the input array dimensions except for the concatenation axis must match exactly
# axis=1を指定すると上のようなエラーが出る
# bをトランスポーズすることでエラーを解消
print(b.T,b.T.shape)
np.concatenate((a, b.T), axis=1)
[[5]
 [6]] (2, 1)
array([[1, 2, 5],
       [3, 4, 6]])
# 行列a,bを平坦化してくっつける
np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])
np.concatenate((a, b)).ravel()
array([1, 2, 3, 4, 5, 6])