Numpyについて


Numpyについて

今回はNumpyについて学習したのでまとめてみました。
要点だけまとめて記述していきます。

Numpyとは

まずNumpyの定義として、
「Pythonにおいて数値計算を効率的に行うための拡張モジュール」
となります。
特に線形代数やベクトルや行列の演算を行うライブラリです。

インストール

numpyのインストール方法。

qiita.py
$ pip install numpy

np.array()

numpyで配列を作るのにはarray()関数を使います。

qiita.py
$ x = np.array([1, 2, 3])
# array([1, 2, 3])

行列、次元数を確認

行列のサイズを確認する時は、shapeを使います。

qiita.py
$ x.shape
# (3,)
# これでは1次元配列になっているので、
$ x = np.array([[1, 2, 3]])
# このように書き換えてshapeを使うと、
$ x.shape
# (1, 3)
# 2次元配列になり1行3列と出力される
$ x = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])
# (3, 3)

reshapeは行と列の変更ができる

qiita.py
$ x = np.array([
    [1, 2, 3],
    [4, 5, 6]
])
# array([[1, 2, 3],[4, 5, 6]
])
$ x.reshape(3, 2)
# array([[1, 2],[3, 4],[5, 6]])

次元数を確認する時は、ndimを使います。

qiita.py
$ x.ndim
# 1次元配列
$ x = np.array([[1, 2, 3]])
# 2次元配列

np.zeros()

zerosは全ての要素を0に変更することができる。

qiita.py
$ np.zeros((2, 2))
# array([[0., 0.],[0., 0.]])
$ x = np.array([[1, 2], [3, 4], [5, 6]) 
np.zeros_like(x)
# array([[0, 0],[0, 0],[0, 0]])

np.ones()

onesもzeros同様に要素を1に変更することができる。

qiita.py
$ np.oness((2, 2))
# array([[1, 1],[1, 1]])
$ x = np.array([[1, 2], [3, 4], [5, 6]) 
np.zeros_like(x)
# array([[1, 1],[1, 1],[1, 1]])

平均

numpyでは平均を出すことも可能です。
meanを使うと要素の平均を出力できます。

qiita.py
$ x = np.array([[1, 2], [3, 4], [5, 6]) 
np.mean(x)
# 3.5
# mean(axis=1)で行(横)の平均を取ることができる
$ x.mean(axis=1)
# array([1.5, 3.5, 5.5])

分散

分散というのは一般的にはデータのばらつき度合いを示すために使われる指標です。
平均との偏差の2乗を平均したものが分散になります。

qiita.py
$ x = np.array([
    [1, 2],
    [3, 4],
    [5, 6]
])
np.var(x)
# 2.9166666666666665

標準偏差(std)

標準偏差は、各データの値と平均値の差(偏差)。

qiita.py
$ x = np.array([
    [1, 2],
    [3, 4],
    [5, 6]
])
x.std()
# 1.707825127659933

最大値、最小値

最大値はmax、最小値minで表現します。

qiita.py
$ x = np.array([
    [1, 2],
    [3, 4],
    [5, 6]
])
x.max()
# 6
x.min()
# 1

# 最大値の要素番号取得
$ np.argmax(x)
# 5

# 最小値の要素番号取得
$ np.argmax(x)
# 0

転置

行と列の位置を変更することができる。

qiita.py
$ x = np.array([
    [1, 2],
    [3, 4],
    [5, 6]
])
x.T
# array([[1, 3, 5], [2, 4, 6]])

四則演算(足し算、引き算、行列積、アダマール積)

足し算

qiita.py
$ a = np.array([[1, 3], [-2, 4]])
b = np.array([[2, -1], [3, 0]])
a + b
# array([[3, 2],[1, 4]])

引き算

qiita.py
$ a = np.array([[1, 3], [-2, 4]])
b = np.array([[2, -1], [3, 0]])
a - b
# array([[-1,  4],[-5,  4]]) 

行列積

qiita.py
$ a = np.array([[1, 3], [-2, 4]])
b = np.array([[2, -1], [3, 0]])
a @ b
# もしくは
a.dot(b)
# array([[11, -1],[ 8,  2]])  

アダマール積

qiita.py
$ a = np.array([[1, 3], [-2, 4]])
b = np.array([[2, -1], [3, 0]])
a * b 
# array([[ 2, -3],[-6,  0]])

条件による選択

不等号によって、TrueとFalseの判定をする。

qiita.py
$ x = np.array([
    [1, 2],
    [3, 4],
    [5, 6]
])
x > 3
# array([[False, False],[False,  True],[ True,  True]])

# Trueを取得したい時
$ x[x > 3]
# array([4, 5, 6])

# Falseを取得したい時
$ x[x < 3]
# array([1, 2])

1次元に変換

ravel()は1次元配列に変換します。

qiita.py
$ x = np.array([
    [1, 2],
    [3, 4],
    [5, 6]
])
x.ravel()
# array([1, 2, 3, 4, 5, 6])

linspaceとarange

linspaceは要素数を指定して等差数列を生成する。

qiita.py
$ np.linspace(0, 1, 11)
# array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])

arangeは間隔を指定して等差数列を生成する。

qiita.py
$ np.arange(-5.0, 5.0, 0.5)
# array([-5.0, -4.5, -4.0, -3.5, -3.0, -2.5, -2.0, -1.5, -1.0, -0.5, 0.0, 0.5, 1.0,  1.5,  2.0,  2.5,  3.0,  3.5,  4.0,  4.5])

乱数の生成

ランダムに値を生成。
randnは標準偏差部分(平均0)で-10~10にて出力。

qiita.py
$ np.random.randn(10)
# array([-0.475776  ,  1.44073112, -1.14907568,  0.80571455,  1.75610703,0.97297991, -1.55111911,  0.19114348,  1.60477607, -1.42002593])

乱数によって生成した値をseed()によって固定することができる。

qiita.py
$ np.random.seed(0)
# array([-0.475776])

randによって0~1の連続する乱数の生成する。

qiita.py
$ np.random.rand(10)
# array([0.79172504, 0.52889492, 0.56804456, 0.92559664, 0.07103606, 0.0871293 , 0.0202184 , 0.83261985, 0.77815675, 0.87001215])

randintによって引数で指定した値を複数取得する。

qiita.py
# 今回は0~100の値のうち10個ランダムで取得
$ np.random.randint(0, 100, 10)
# array([82, 46, 99, 20, 81, 50, 27, 14, 41, 58])

shuffleで文字列の位置をランダムに取得できる

qiita.py
$ x = ['A', 'B', 'C', 'D', 'E']
np.random.shuffle(x)
# ['E', 'D', 'C', 'B', 'A']

np.eye()

個人で解説するよりわかりやすいサイトがあったので貼っておきます。
NumPyのeye関数で単位行列を作成する方法

qiita.py
$ x = np.eye(5)
#array([[1., 0., 0., 0., 0.],
#      [0., 1., 0., 0., 0.],
#       [0., 0., 1., 0., 0.],
#       [0., 0., 0., 1., 0.],
#      [0., 0., 0., 0., 1.]])

intの挙動(追記)

intの挙動範囲

int8 -128 ~ 127
int16 -32768 ~ -2147483647
int32 -2,147,483,648 ~ 2,147,483,647
int64 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
uint8 0 ~ 255
uint16 0 ~ 65,535
uint32 0 ~ 4,294,967,295
uint64 0 ~ 18,446,744,073,709, 551,615

最後に

今回Numpyについて以上です。
Numpyについての理解と練習問題をどんどん解いて理解を深めていきます。
次回pandasについて投稿していきます!!