[NumPy_03] 各種アトリビュート、メソッドの使い方

Posted on 2019/03/09 in programming , Updated on: 2019/04/03

はじめに

下記のような2つの配列を用意する。 NumPy の基本的な使い方は、別記事[NumPy_01] 基本的な操作を参照。

arr = np.arange(25)
# array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
#        17, 18, 19, 20, 21, 22, 23, 24])

ranarr = np.random.randint(0,50,10)
# array([ 9, 13, 45, 25, 27, 22,  2, 29, 21,  9])

.reshape()

同じデータを使用した、新しい形状の配列を返す。
reshape()メソッドを利用す場合、初期配列サイズが引数に与えた配列サイズと一致している必要がある。

arr.reshape(5, 5)
# array([[ 0,  1,  2,  3,  4],
#        [ 5,  6,  7,  8,  9],
#        [10, 11, 12, 13, 14],
#        [15, 16, 17, 18, 19],
#        [20, 21, 22, 23, 24]])

別の一般的な再整形パターンは、一次元配列の二次元行または列行列への変換する方法がある。スライス操作内で newaxis キーワードを使用することで実行できる。

x = np.array([1, 2, 3])

# どちらも同じ結果になる
x.resphape(1,3)
x[np.newaxis, :]
# array([[1, 2, 3]])

# どちらも同じ結果になる
x.reshape(3,1)
x[:, np.newaxis]
# array([[1],
#        [2],
#        [3]])

.shapeを使って配列の形状を確認する。

arr.shape
# (25,)

arr.reshape(5, 5).shape
# (5, 5)

配列の連結

NumPy での配列結合には、おもにnp.concatenate, np.vstack, np.hstackが用いられる。

np.concatenate()

引数に、要素が NumPy 配列であるリストを渡す。

x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
z = np.array([9, 9, 9])
np.concatenate([x, y, z])
# array([1, 2, 3, 3, 2, 1, 9, 9, 9])

2次元配列の場合も同様に。また引数に軸(axis)を指定することで、連結する方向を指定できる。

mat = np.array([[1, 2, 3],
                [3, 2, 1]])
np.concatenate([mat, mat])
# array([[1, 2, 3],
#        [3, 2, 1],
#        [1, 2, 3],
#        [3, 2, 1]])

np.concatenate([mat, mat], axis=1)
# array([[1, 2, 3, 1, 2, 3],
#        [3, 2, 1, 3, 2, 1]])

np.vstack(), np.hstack()

次元が混在する配列を扱う場合は、np.vstack()(vertical:垂直), np.hstack()(horizontal:水平)関数を利用する方が直感的に操作できる。

・ np.vstack()

x = np.array([1, 2, 3])
mat = np.array([[9, 8, 7],
                 [6, 5, 4]])
np.vstack([x, mat])
# array([[1, 2, 3],
#        [9, 8, 7],
#        [6, 5, 4]])

・np.hstack()

y = np.array([[99],
              [99]])
np.hstack([mat, y])
# array([[ 9,  8,  7, 99],
#        [ 6,  5,  4, 99]])

配列の分割

基本的に、上記の連結と反対の作業になる。関数は、np.split, np.hsplit, np.vsplitを利用する。

np.split()

第一引数には、分割する配列を、第二引数に分割するポイント(インデックス)をリスト型で渡す。

x = [1, 2, 3, 99, 99, 3, 2, 1]
x1, x2, x3 = np.split(x, [3, 5])
print(x1, x2, x3)

# [1 2 3] [99 99] [3 2 1]

np.vsplit(), np.hsplit()

np.split()と同様に、第一引数に分割する配列を、第二引数に分割するポイント(インデックス)をリスト型で渡す。

・np.vsplit()

mat = np.arange(9).reshape(3,3)
# array([[0, 1, 2],
#        [3, 4, 5],
#        [6, 7, 8]])

x1, x2 = np.vsplit(mat, [2])
print(x1)
# [[0 1 2]
#  [3 4 5]]
print(x2)
# [[6 7 8]]

・np.hsplit()

x1, x2 = np.hsplit(mat, [2])
print(x1)
# [[0 1]
#  [3 4]
#  [6 7]]
print(x2)
# [[2]
#  [5]
#  [8]]

配列関数

NumPy には多くの配列関数が付属している。配列全体で操作を実行するために使用できる。

# 各要素の平方根を取得
np.sqrt(arr)
# array([0.        , 1.        , 1.41421356, 1.73205081, 2.        ,
#        2.23606798, 2.44948974, 2.64575131, 2.82842712, 3.        ,
#        3.16227766])

# 指数関数
np.exp(arr)
# array([1.00000000e+00, 2.71828183e+00, 7.38905610e+00, 2.00855369e+01,
#        5.45981500e+01, 1.48413159e+02, 4.03428793e+02, 1.09663316e+03,
#        2.98095799e+03, 8.10308393e+03, 2.20264658e+04])

# sin
np.sin(arr)
# array([ 0.        ,  0.84147098,  0.90929743,  0.14112001, -0.7568025 ,
#        -0.95892427, -0.2794155 ,  0.6569866 ,  0.98935825,  0.41211849,
#        -0.54402111])

# log
np.log(arr)
# array([      -inf, 0.        , 0.69314718, 1.09861229, 1.38629436,
#        1.60943791, 1.79175947, 1.94591015, 2.07944154, 2.19722458,
#        2.30258509])