NumPy 配列
NumPyの配列(numpy.ndarray型)の生成、アクセス
numpy.ndarray型(以下では、ndarray型と表記)は、多次元配列のデータ型で、次の特徴を持つ。
- 同じ型のデータだけを配列要素として格納できる。
- 異なる型のデータを混在させる事ができない。
- 各次元方向の要素数は同じ。2次元なら、
- print文で表示すると、カンマ無しで表示される。
1次元のndarray型の例
import numpy as np # 1次元のndarray型を、list型から生成 aaa = np.array([1.1, 5.3, 8.2, 10]) # ndarray型をprint文で表示 print(aaa) # [ 1.1 5.3 8.2 10. ] ※カンマ無しで表示 print(aaa[0]) # 0番目の要素にアクセス # 1.1 print(aaa[2]) # 2番目の要素にアクセス # 8.2 print(aaa[-1]) # 最後から1番目の要素にアクセス # 10.0 print(aaa[-2]) # 最後から2番目の要素にアクセス # 8.2 aaa[2] = 999 # 2番目のデータを書き換え print(aaa) # [ 1.1 5.3 999. 10. ]
2次元のndarray型の例
import numpy as np # 2次元のndarray型を、list型から生成 aaa = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) # ndarray型をprint文で表示 print(aaa) # [[1 2 3 4] # [5 6 7 8]] ※カンマ無しで表示 print(aaa[0][0]) # 0行0列の要素にアクセス # 1 print(aaa[1][2]) # 1行2列の要素にアクセス # 7 print(aaa[1]) # 1行の要素にアクセス # [5 6 7 8] aaa[1][3] = 99 # 1行3列の要素のデータを書き換え print(aaa) # [[ 1 2 3 4] # [ 5 6 7 99]]
tuple型からも、ndarray型を生成可能
import numpy as np # 1次元のndarray型を、tuple型から生成 aaa = np.array((3, 8, 5, 4)) print(aaa) # [3 8 5 4] ※カンマ無しで表示
配列形状サイズの取得
.shape属性で、配列の形状(各次元のサイズ)を取得できる。
.ndim属性で、配列の次元数を取得できる。
.size属性で、配列のトータル要素数を取得できる。
import numpy as np # 1次元配列 ary1d = np.array([3, 4, 5]) print(ary1d) # [3 4 5] print(ary1d.shape) # 形状を取得 # (3,) print(ary1d.ndim) # 次元数を取得 # 1 print(ary1d.size) # トータル要素数を取得 # 3 # 2次元配列 ary2d = np.array([[3, 4, 5, 6], [11, 10, 9, 8]]) print(ary2d) # [[ 3 4 5 6] # [11 10 9 8]] print(ary2d.shape) # 形状を取得 # (2, 4) print(ary2d.ndim) # 次元数を取得 # 2 print(ary2d.size) # トータル要素数を取得 # 8 # 3次元配列 ary3d = np.array([[[3, 4, 5, 6], [11, 10, 9, 8], [21, 22, 23, 24]], [[0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]]) print(ary3d) # [[[ 3 4 5 6] # [11 10 9 8] # [21 22 23 24]] # # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11]]] print(ary3d.shape) # 形状を取得 # (2, 3, 4) print(ary3d.ndim) # 次元数を取得 # 3 print(ary3d.size) # トータル要素数を取得 # 24
配列データの追加
np.insert()関数で、配列データを追加できる。
戻り値が追加された配列データ。元の配列はそのまま。
1次元配列に追加の例
import numpy as np src1d = np.array([0, 1, 2, 3, 4]) # 2番目の手前に追加 ※先頭は0番目 dst1d = np.insert(src1d, 2, 10) print(dst1d) # [ 0 1 10 2 3 4] # 2番目の手前にlist型配列を追加 dst1d = np.insert(src1d, 2, [10, 11]) print(dst1d) # [ 0 1 10 11 2 3 4] # 2番目の手前にndarray型配列を追加 add = np.array([10, 11]) dst1d = np.insert(src1d, 2, add) print(dst1d) # [ 0 1 10 11 2 3 4] # 末尾に追加 add = np.array([10, 11]) dst1d = np.insert(src1d, 5, add) print(dst1d) # [ 0 1 2 3 4 10 11]
2次元配列に行データの追加の例
import numpy as np src2d = np.array([[0, 1, 2, 3], [4, 5, 6, 7]]) # 1行目の手前に行データを追加 ※先頭行は0行目 add = np.array([10,11,12,13]) # add = np.array([[10,11,12,13]]) # 上式の代わりに、これにしても結果は同じ dst2d = np.insert(src2d, 1, add, axis=0) print(dst2d) # [[ 0 1 2 3] # [10 11 12 13] # [ 4 5 6 7]] # 1行目の手前に複数行データを追加 add = np.array([[10,11,12,13], [14,15,16,17]]) dst2d = np.insert(src2d, 1, add, axis=0) print(dst2d) # [[ 0 1 2 3] # [10 11 12 13] # [14 15 16 17] # [ 4 5 6 7]]
2次元配列に列データの追加の例
注意:追加する列データは、転置して行データにしておく。
import numpy as np src2d = np.array([[0, 3], [1, 4], [2, 5]]) # 1列目の手前に列データを追加 ※先頭列は0 add = np.array([10,11,12]) # 転置して行データにしておく # add = np.array([[10,11,12]]) # 上式の代わりに、これにしても結果は同じ dst2d = np.insert(src2d, 1, add, axis=1) print(dst2d) # [[ 0 10 3] # [ 1 11 4] # [ 2 12 5]] # 1列目の手前に複数列データを追加 add = np.array([[10,11,12], [13,14,15]]) # 転置して行データにしておく dst2d = np.insert(src2d, 1, add, axis=1) print(dst2d) # [[ 0 10 13 3] # [ 1 11 14 4] # [ 2 12 15 5]]
複数のndarray型2次元配列の結合
np.vstack()関数で、列数が等しい複数の2次元配列を縦方向に結合できる。
np.hstack()関数で、行数が等しい複数の2次元配列を横方向に結合できる。
2次元配列の縦方向結合
import numpy as np aaa = np.array([[0, 1, 2, 3], [4, 5, 6, 7]]) bbb = np.array([10,11,12,13]) # 2次元配列と1次元配列の縦結合 ccc = np.vstack((aaa, bbb)) print(ccc) # [[ 0 1 2 3] # [ 4 5 6 7] # [10 11 12 13]] # 2次元配列と2次元配列の縦結合 ddd = np.vstack((aaa, aaa)) print(ddd) # [[0 1 2 3] # [4 5 6 7] # [0 1 2 3] # [4 5 6 7]] # 3つ配列の縦結合 eee = np.vstack((aaa, bbb, aaa)) print(eee) # [[ 0 1 2 3] # [ 4 5 6 7] # [10 11 12 13] # [ 0 1 2 3] # [ 4 5 6 7]]
2次元配列の横方向結合
import numpy as np aaa = np.array([[0, 3], [1, 4], [2, 5]]) bbb = np.array([[10], [11], [12]]) # 2次元配列と2次元配列の横結合 ccc = np.hstack((aaa, bbb)) print(ccc) # [[ 0 3 10] # [ 1 4 11] # [ 2 5 12]] # 3つ配列の横結合 eee = np.hstack((aaa, bbb, aaa)) print(eee) # [[ 0 3 10 0 3] # [ 1 4 11 1 4] # [ 2 5 12 2 5]]
配列データの削除
np.delete()関数で、配列データを削除できる。
戻り値が削除された配列データ。元の配列はそのまま。
import numpy as np src = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12]]) print(src) # 軸0だから、1行目を削除 ※先頭行は0行目 dst = np.delete(src, 1, axis=0) print(dst) # [[ 1 2 3 4] # [ 9 10 11 12]] # 軸1だから、1列目を削除 ※先頭列は0列目 dst = np.delete(src, 1, axis=1) print(dst) # [[ 1 3 4] # [ 5 7 8] # [ 9 11 12]]