Python

Pythonで配列や行列の結合

配列の結合

配列を結合するときに、appendとextendが使える。
これらは、それぞれ結果が異なる。

unite_list_1.py
a = [1,2,3]
b = [4, 5]

# appendで要素を結合
a1 = a
a1.append(4)
print(a1) # [1, 2, 3, 4]

# appendで配列を結合すると、結合した配列が入れ子になる
a1 = a
a1.append(b)
print(a1) # [1, 2, 3, [4, 5]] 

# extendなら、配列が入れ子にならない
a1 = a
a1.extend(b)
print(a1) # [1, 2, 3, 4, 5]

2次元配列を結合したときの結果

unite_list_2.py
a=[[1,2,3],[4,5,6]]
b=[[7,8],[9,10]]

#appendで配列を結合すると、やっぱり入れ子になる
a1 = a
a1.append(b)
print(a1) # [[1, 2, 3], [4, 5, 6], [[7, 8], [9, 10]]]

#extendで結合すると、入れ子にならない
a1 = a
a1.extend(b)
print(a1) # [[1, 2, 3], [4, 5, 6], [7, 8], [9, 10]]

行列の結合

配列の結合はできたものの、行列の結合のような操作は少し面倒になる。

unite_list_3.py
a=[[1,2,3],[4,5,6]]
b=[[7,8],[9,10]]
a1 = a

for i in range(2):
    a1[i].extend(b[i])

print(a1) # [[1, 2, 3, 7, 8], [4, 5, 6, 9, 10]]

そこで、Numpyを使うと簡単にできる。たとえば、行列を列を増やす方向に結合の場合:

numpy_1.py
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[7,8],[9,10]])

c = np.concatenate((a,b), axis = 1) 
print(c)

#または

c = np.c_[a,b]
print(c)

#または

c = np.hstack([a,b])
print(c)

# 結果:
#  [[ 1  2  3  7  8]
#  [ 4  5  6  9 10]]

行を増やす方向の結合:

numpy_1.py
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[7,8],[9,10]])

c = np.concatenate((a.T,b), axis = 0) 
print(c)

#または

c = np.r_[a.T,b]
print(c)

#または

c = np.vstack([a.T,b])
print(c)

# 結果:
# [[ 1  4]
#  [ 2  5]
#  [ 3  6]
#  [ 7  8]
#  [ 9 10]]

Numpyを使う場合でも、行数、列数が合っていないとエラーになるので注意は必要。

環境

Windows10 64bit
Python 3.6.4
Conda 4.4.11 (Anaconda 3)

参照

Numpyで行列の連結