TensorFlowで線形代数入門(0)NumPyの使い方まとめ

TensorFlowを学ぶにあたって、まず予備知識が色々必要になるのでこの章でそれを書きます。

TensorFlowってどう読むと思いますか?

テンサーフローと読む人もいればテンソルフローと読む人もいます。経験的には工学系の人はテンソルフローって読む人が多いです。

それもそのはず、この行列計算ライブラリは、テンソルを駆使するためのライブラリだからです。

TensorFlowのTensorってなに?

テンソルとは「テンソル積というものが定義できるようなベクトル空間の元となるもの」です。

例えば、

スカラは0階テンソル。スカラは重さとか距離などのように、大きさはあるけど向きがないものを言います。

ベクトルは1階のテンソル。大きさと向きがあるものをテンソルと言います。

行列は2階のテンソルです。

3階以上のテンソルは単にテンソルって言います。

まあ今は難しいことは置いておきましょう。実際にtensorflowを使いながらの方がイメージもしやすいので。

numpyの使い方まとめ

基礎

pythonにはnumpyというライブラリがあり、これは数値を簡単に表してくれる優れものです。これNumPyと表記するらしく、読み方はナンパイらしいです。ずっとナンピーかと思ってました。

例えば、

import numpy as np

a = np.array([1, 3, 5, 7, 9])
b = np.array([0, 2, 4, 6, 8])

配列オブジェクトa、bを作るとします。そして

np.add(a, b)

を実行すると、

array([ 1,  5,  9, 13, 17])

aの0番目 + bの0番目、aの1番目 + bの1番目というように、インデックス番号に対応する要素同士が足されていっています。

でも普通にpythonのやり方でも足せます。

a + b

を出力すると、

array([ 1,  5,  9, 13, 17])

同じ結果ですね。

引き算はnp.subtract、掛け算はnp.multiply、割り算はnp.divide、割った余りを出すのはnp.modです。これらもpythonの四則演算のやり方でも求められます。

概数を求める関数は

切り上げ: np.floor か np.trunc

切り捨て: np.ceil

四捨五入: np.round か np.around か np.rint

絶対値: np.absolute(abs) か np.fabs

0に近い方で整数をとる: np.fix

などとやたら同じやつがあります。np.absoluteでは複素数の絶対値を返すことができるけど、np.fabsでは絶対値を返すことができないというような微妙な違いはあるようです。

累乗はnp.powerで表します。

np.power(3, 2)

の出力は9です。3の2乗ということです。

配列オブジェクトを入れることもできます。

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
b = np.array([1, 2, 1, 2, 1, 2, 1, 2, 1, 2])
np.power(a, b)

この出力は、

array([  1,   4,   3,  16,   5,  36,   7,  64,   9, 100])

このようになり、これもそれぞれのインデックス番号に対応したもの同士の演算になっています。

平方根はnp.sqrtを使います。

np.sqrt(2)

この出力は、

1.4142135623730951

こうなります。配列にも使えます。

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
np.sqrt(a)

これを出力すると、

array([1.        , 1.41421356, 1.73205081, 2.        , 2.23606798,
       2.44948974, 2.64575131, 2.82842712, 3.        , 3.16227766])

全要素の平方根を出します。

np.arangeという関数で、数字を一気に表示させることができます。

たとえば、

np.arange(2, 15, 1)

と書いて出力すると、

array([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

となります。これは2から始まって15 – 1までの数字を1ずつ表示するという意味です。

例えば

np.arange(1, 13, 3)

と書いて出力すると

array([ 1,  4,  7, 10])

となります。1から始まって13 – 1までの数字を、3ずつ表示させる、という意味になります。

三角関数

三角関数は、np.sin、np.cos、np.tanのような関数を使います。

a = np.sin(0)
b = np.cos(0)
c = np.sin(np.pi*0.5)
d = np.cos(np.pi*1)
e = np.tan(1)

これをそれぞれ出力すると、

aは0.0、bは1.0、cは1.0、dは−1.0、eは1.557407724654902になります。

cはsin(π/2)を表しています。

逆三角関数はnp.arcsin、np.arccos、np.arctanを使います。

三角関数の逆、つまりsin(x) = yのとき、arcsin(y) = xになります。

np.cos(0)

この出力は1.0になるので、次のようにその逆関数をとると

np.arccos(1.0)

出力は0.0になります。

radianとdegreeの変換を行う関数もあります。degreeにπ/180をかければradianになるし、radianに180/πをかければdegreeになりますが、関数を使うと簡単です。

np.deg2rad(180)

出力:

3.141592653589793

np.radiansという関数はこのnp.deg2radと同じです。

逆に、

np.rad2deg(np.pi)

この出力は、180.0になります。

指数関数・対数関数

指数関数はnp.expで表します。

np.exp(1)

出力:2.718281828459045

これはネイピア数を一乗しているという意味です。

np.e

これでネイピア数を出力することもできます。

出力:2.718281828459045

np.exp(2)

出力:7.38905609893065

対数はnp.log~ で表します。np.log2のようにすると底が2、np.logのように何もつけないと底がネイピア数になります。

np.log(np.e)

出力:1.0

np.log2(4)

出力:2.0

ただし、底は2と10しか用意されていません。底を3にしたい時には

np.log(9)/np.log(3)

出力:2.0

このようにしてあげます。これはつまりnp.log3(9)と同じになります。

複素数

a = 2 + 3j
np.real(a)

これで実部を返すので、出力は2.0になります。

np.imag(a)

これで虚部を返し、出力は3.0になります。

np.conj(a)

これで複素共役を返し、出力は(2-3j)となります。

まとめ

ざっとnumpyの使い方を説明してみました。

こちらの記事を大いに参考にさせていただきました。

https://deepage.net/features/numpy-math.html

こういう方々のおかげで楽しく勉強できます。感謝です。

自分もこのブログで、いつか何らかの形で誰かのお役にたちたいと思っています。

では。

TechBoostではAI、IoT、ブロックチェーンなどの最新技術を学ぶことができます。

Tech Boost