[NumPy_01] 基本的な操作
Posted on 2019/03/07 in programming , Updated on: 2019/04/03
はじめに
NumPyは、python で配列の計算をするためのライブラリ。配列同士の計算が、高速にできる。1次元(ベクトル)、2次元(マトリックス)、3次元(テンソル)配列の直感的な演算処理が可能。
NumPy と似た python ライブラリでは、有名なpandasがある。
(pandasの中でもNumPyは使われています)
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])