[NumPy_01] 基本的な操作

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

はじめに

NumPyは、python で配列の計算をするためのライブラリ。配列同士の計算が、高速にできる。1次元(ベクトル)、2次元(マトリックス)、3次元(テンソル)配列の直感的な演算処理が可能。

NumPy と似た python ライブラリでは、有名なpandasがある。
(pandasの中でもNumPyは使われています)  

[pandas] 基本的な操作

NumPy と pandas の違いは、下記図のようなイメージ。NumPy は数字だけを扱うことに特化。pandas は様々なデータ形式や欠損値への処理が可能で、機械学習などにおいては、元データを pandas で呼び出して整形、NumPy で数値処理 => 機械学習ライブラリへといった流れになることが大半。

NumPy pandas
扱うデータ 数値 様々(数値、文字列、時系列)
計算速度 高速 NumPyよりは遅い
得意な処理 配列演算処理 データ整形、欠損値処理

インストール

$ pip3 install NumPy

インポート

np としてインポートするのが慣例。

import numpy as np

NumPy アレイの作成

pythonリストから作成

単純に python リストを渡して、NumPy アレイを作成することができる。

# 1次元アレイ
my_list = [1, 3, 4, 10]
np.array(my_list)

# array([1, 3, 4, 10])


# 2次元アレイ
my_matrix = [[1, 3, 4], [9, 2, 3], [2, 5, 9]]
np.array(my_matrix)

# array([[1, 3, 4],
#        [9, 2, 3],
#        [2, 5, 9]])

# 3次元アレイ
my_tensor = [[[ 1,  2], [ 3,  4], [ 5,  6]],
             [[ 7,  8], [ 9, 10], [11, 12]],
             [[13, 14], [15, 16], [17, 18]]]
np.array(my_tensor)
# array([[[ 1,  2],
#         [ 3,  4],
#         [ 5,  6]],
#
#        [[ 7,  8],
#         [ 9, 10],
#         [11, 12]],
#
#        [[13, 14],
#         [15, 16],
#         [17, 18]]])

NumPy関数を使ってアレイの作成

np.arange()

NumPy のarange()は、pythonのrange()と同じような働きをする。np.arange(start, end, (step))という形で引数を渡す。

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

np.arange(0, 11, 2)
# array([0, 2, 4, 6, 8, 10])

np.zeros(), np.ones()

0のみ、1のみの要素を持つ配列の作成。

np.zeros(4)
# array([0., 0., 0., 0.,])

np.zeros((3, 2))
# array([[0., 0.],
#        [0., 0.],
#        [0., 0.]])

np.ones(3)
# array([1., 1., 1.])

出力結果からわかるように、zeros も ones も小数点がついている。これはデフォルトで出力される type が float になっているため。整数で表したい場合は、引数に dtype=int を渡す。

np.zeros(4, dtype=int)
# array([0, 0, 0, 0])

np.ones(3, dtype=int)
# array([1, 1, 1])

np.full()

同じ要素で全てを埋める。第一引数に配列、第二引数に埋める要素を指定。

np.full((3, 5), 3.14)

# array([[3.14, 3.14, 3.14, 3.14, 3.14],
#        [3.14, 3.14, 3.14, 3.14, 3.14],
#        [3.14, 3.14, 3.14, 3.14, 3.14]])

np.linspace()

始まりと終わりの数字を指定して、均等に分割する。np.linspace(start, end, 分割数)という形で引数を渡す。

np.linspace(0, 10, 3)
# array([ 0.,  5., 10.])

np.linspace(0, 10, 10)
# array([ 0.        ,  1.11111111,  2.22222222,  3.33333333,  4.44444444,
#         5.55555556,  6.66666667,  7.77777778,  8.88888889, 10.        ])

np.eye()

単位行列を生成する。

np.eye(3)
# array([[1., 0., 0.],
#        [0., 1., 0.],
#        [0., 0., 1.]])

NumPy配列形状の確認

numpy.array のアトリビュートを使って配列の形状をやサイズを確認することができる。

  • ndim : 次元数
  • shape : 各次元におけるサイズ
  • size : アレイ全体のサイズ
# 3次元アレイ
my_tensor = [[[ 1,  2], [ 3,  4], [ 5,  6]],
             [[ 7,  8], [ 9, 10], [11, 12]],
             [[13, 14], [15, 16], [17, 18]]]
tensor1 = np.array(my_tensor)

print("ndim  : ", tensor1.ndim)
print("shape : ", tensor1.shape)
print("size  : ", tensor1.size)
ndim  :  3
shape :  (3, 3, 2)
size  :  18

NumPyアレイ要素の抜出し

Python リストと同様にインデックスで要素を抜き出すことが可能。

my_matrix = [[1, 3, 4], [9, 2, 3], [2, 5, 8]]
x = np.array(my_matrix)

x[0]
# array([1, 3, 4])

x[1,0]
# 9

x[2,-1]
# 8

要素の置換

Python リストと同様に、インデックスで要素を指定して別の値を代入することが可能

my_matrix = [[1, 3, 4], [9, 2, 3], [2, 5, 8]]
x = np.array(my_matrix)

x[0,0] = 7
x
# array([[7, 3, 4],
#        [9, 2, 3],
#        [2, 5, 8]])

注意

NumPy アレイは、固定型を持っている。つまり、一つの NumPy アレイ配列の中の要素の型は一つしかない。(整数型ならすべての要素が整数という風に)
そのため、Pythonリストとは異なり、例えば、浮動小数点値を整数配列に挿入しようとすると、その値は暗黙のうちに切り捨てられることになる。

my_list = [1, 2, 3]
x = np.array(my_list) # 整数型のアレイが作成された

x[0] = 5.55 # 浮動小数点値を代入
x
# array([5, 2, 3]) # 5.55が切り捨てられて5になってる。

Selection

比較演算子を使って、要素が全て Boolean型(True or False)のアレイを返す。

arr > 4
# array([False, False, False, False,  True,  True,  True,  True,  True, True])

bool_arr = arr  4
arr[bool_arr]
# array([ 5,  6,  7,  8,  9, 10])

配列演算

pythonのlistとは異なり、配列同士の演算が容易に可能。

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

# 加算。対応する要素同士が加算される。
arr + arr
# array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18, 20])

# 乗算。対応する要素同士が乗算される。
arr * arr
# array([  0,   1,   4,   9,  16,  25,  36,  49,  64,  81, 100])

arr**4
# array([    0,     1,    16,    81,   256,   625,  1296,  2401,  4096,  6561, 10000])