チャポケのブログ

勉強したことをまとめておく。

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]]