import numpy as np
import matplotlib.pyplot as plt
# jupyter notebookに画像を表示
%matplotlib inline
type(np.sin)
x = np.linspace(0.001, 5 * np.pi)
plt.plot(x, np.sin(x) / x)
ufuncは、Pythonのループの遅さという欠点を補うために生まれました。
比較してみましょう。
t = np.linspace(0, 1, 1000)
%%timeit
for _t in t:
np.sin(_t)
%%timeit
np.sin(t)
少なくとも100倍以上は速くなっています。
なるべく配列を一気にufuncに投げるようにしましょう。
# 平方根
np.sqrt([0, 2, 3, 5, 9])
# 自然対数
np.log([1, np.e, np.e**2])
# 底が10
np.log10([0.0001, 1.e-100, 1, 10, 100])
# ラジアンから度への変換
np.rad2deg(np.linspace(0, np.pi, 10))
# 度からラジアンへの変換
np.deg2rad(np.linspace(0, 180, 10)) / np.pi
ufuncはとても数が多いので、公式HPの下の方を参照してください。
例えばndarray.sum関数は、引数にaxisを取ります。この場合のaxisは「和を取る方向」を意味しています。
A = np.arange(6).reshape(3, 2)
A
A.sum(axis=0) # 縦方向の和
A.sum(axis=1) # 横方向の和
A.sum() # 全要素の和
上の結果を見てもらえると分かるように、axis=0やaxis=1である軸について和を取ると次元が1つ落ちます。
axisを指定しないとスカラーまで次元が落ちます。このように特定の軸について次元を落とす操作をReductionといいます。
axis=0でReductionを行うと、shapeが(n, m)が (m,)になります。
axisは、潰す軸を指定すると考えると忘れないと思います。
引数にaxisを取るndarrayの主な関数の表がこちらです。より詳細に知りたい方はここを見てください。
|関数名|説明| |:------:|:--:| |sum|和| |max|最大値| |min|最小値| |argmax|最大値を取るインデックス| |argmin|最小値を取るインデックス| |cumsum|累積和| |mean|平均値| |var|分散| |std|標準偏差| |all|全てTrueならTrue| |any|一つでもTrueがあればTrue|
累積和を使うと、ランダムウォークを一行で書くこともできます。
plt.plot(np.random.choice([-1, 1], size=(1000, 10)).cumsum(axis=0))
plt.show()