学習メモ・備忘録
Numpyについて
豊富な数学計算ライブラリをもち、効率的な数値計算を行うことのできる代表的なライブラリ。
ndarray型
代表的な数値計算パッケージのNumpy
で使用する基本データ型。
記述例
# ndarray型の作成
import numpy
a = [0, 1, 2, 3]
b = numpy.array(a) # リストからndarray型を作成
print('b = ', b)
c = [1, 2]
d = [2, 3]
e = [3, 4]
f = numpy.array([c, d, e]) # 二次元のndarray型を作成
print('f = ', f)
g = numpy.array(a, dtype = numpy.float16) # データ型を指定してndarrayを作成
print('g = ', g)
実行結果
b = [0 1 2 3]
f = [[1 2]
[2 3]
[3 4]]
g = [0. 1. 2. 3.]
基本的な数値演算を行うメソッド
ndarray型のデータやリストに対して、Numpyに用意されているメソッドを使うと様々な数値演算ができる。代表的な物を以下に紹介する。
import numpy
h = numpy.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
i = numpy.median(h) # 中央値
j = numpy.mean(h) # 平均値
k = numpy.std(h) # 標準偏差
l = numpy.var(h) # 分散
print(i)
print(j)
print(k)
print(l)
実行結果
4.5
4.5
2.8722813232690143
8.25
非数と無限大
Numpyでは数値でないことを示す非数nan
と無限大を表すinf
を使用できる。
非数値nan
nan
は0
を0
で割ると現れる値である。あらゆる値との比較でFalse
を返す特殊な値であるため、自分自身との比較でもFalse
を返す。そこで、is
を用いてnan
との同一性を確認することができる。
from numpy import nan
m = float32(0) / float32(0)
n = m == nan
o = nan == nan
p = m is nan
print(m)
print(n)
print(o)
print(p)
実行結果
nan
False
False
True
無限大値inf
inf
は絶対値のある値を0
で割ることで現れる値である。==
を用いた比較でもis
を用いた比較でもTrue
を返す。
from numpy import inf
q = float(10) / float(0)
r = q == inf
s = q is inf
print(q)
print(r)
print(s)
実行結果
inf
True
True
注意したいリストとの違い
リストとndarray
型は共に配列を扱う代表的なデータ型であり、使い方も似ているが、非なる点もあるので注意。
演算子の利用
+
演算子は、リスト同士ではリストの結合、ndarray
同士では値同士の加算を意味する。整数値との+
演算はリストの場合エラーになるがndarray
では整数値の加算を表す。
*
演算子は、リスト同士ではエラーにるが、ndarray
同士では値同士の乗算を表す。整数値との*
演算はリストの場合はリストの繰り返しを表し、ndarray
では整数値の乗算を表す。
リストにおける演算子
t = [0, 1, 2]
u = [3, 4, 5]
print(t + u)
# print(t + 2) エラー
# print(t * u) エラー
print(t * 2)
実行結果
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 0, 1, 2]
ndarray
における演算子
import numpy
v = numpy.array([0, 1, 2])
w = numpy.array([3, 4, 5])
print(v + w)
print(v + 10)
print(v * w)
print(v * 2)
実行結果
[3 5 7]
[10 11 12]
[ 0 4 10]
[0 2 4]
多次元配列
ndarray
はリストとは異なり、各次元の要素の数が異なるデータは作成できない。すなわち、ndarray
型で作成するデータは全て行数と列数が一致した多次元配列でなければいけない。長さの異なるリストから二次元配列を作成しようとすると、リストとndarray
では以下のように異なった挙動を見せる。
import numpy
x = [[0, 1], [2, 3, 4], [5, 6]]
y = numpy.array([[0, 1], [2, 3, 4], [5, 6]])
print(x)
print(y)
実行結果
[[0, 1], [2, 3, 4], [5, 6]]
[list([0, 1]) list([2, 3, 4]) list([5, 6])]
インデックス指定・スライス指定
,
と:
を用いてリストやndarray
の要素を抽出できる。
import numpy
z = numpy.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
print(z[0, 2]) # インデックス0の中のインデックス2
print(z[2, 1:]) # インデックス2の中のインデックス1以降
print(z[ :, 2]) # 全てのインデックスの中のインデックス2
実行結果
2
[7 8]
[2 5 8]