1.4. NumPy/SciPy¶
python本体(標準ライブラリー)には、数学/物理に使える関数はほぼ何も定義されていないので、python本体だけでは数値計算はできない。一般的にコードを書くときにはpython本体だけでなく、さまざまなモジュール(module)を必要に応じて追加(インポート, import)していくことになる。数値計算では、NumPyという非常に強力な数値計算モジュールが用意されていて、数学で使える基本的な関数はほんどすべて揃っている。今後講義でコードを書くときは、ほぼ100%、NumPyを使うことになるし、pythonを使っている科学技術計算、機械学習を含むデータサイエンスでは常にNumPyを用いていると思っていい。それほど重要なモジュールである。
SciPyはNumPyを基にしてさらに高度な数値計算が可能なモジュールである。ざっくりいうと上位互換と思っていい。公式に細かい使い方が書かれているので、functionのargumentや「こんな関数ないかな」と調べるときに参考にするよい。公式なので当たり前だがgoogleで検索して出てくる適当なサイトより網羅的にかつ正確に書かれている。
モジュールを取り込むにはimport
を使う。以下のように、numpy
をimport
してnp
と省略するところからすべてのコードが始まる。
import numpy as np
なにも出力されないが、これでnumpy
モジュールがimportされた。まずはnp
に用意されている初等関数を使ってみる。ほとんどの初等関数はnp.関数名前
という形で定義されている。
np.sqrt(2)
np.cos(0)
np.exp(1)
円周率$\pi$やネイピア数の$e$などの定数も意義されている。
np.pi
np.e
SciPyでも同様なことができる。
import scipy
print(scipy.pi)
あるいは以下のようにすることもできる。
from scipy import pi
print(pi)
このようにfrom "モジュール名" import "名前"
のようにimportすることもできる。その場合はscipy.pi
ではなくpi
と書いてもよい。
複素数はpythonの標準ライブラリーに入っているのでimportせずに使うことができる。ただし、複素数はi
ではなく、1j
で表す。
a = 2 + 3j
a.real
a.imag
複素数a
実部や虚部をとる場合は、後ろに.real
や、.imag
をつける。このように.
を付けた後ろの部分を属性(attribute)というのだが、どうしてこういう書き方をするのかは、pythonのclassの詳細に関連して説明するので、今のところはそういうものだと思ってもらいたい。
なお、複素数1j
の代わりに1i
としてもpythonは理解してくれない。
a = 2 +3i
理学系の人にとって複素数は$i$だが、工学系の人にとって$i$という文字は電流と混同しやすいので、複素数は$i$の代わりに$j$を使うのがプログラミング以外でも一般的である。
e^{i\theta} = \cos \theta + i \sin \theta
\end{equation}
が、$\theta = \frac{\pi}{2}$で成り立っていることを確認せよ。
(1.4.2.) 虚数単位$i$の$i$乗の主値が実数となるとことを確認せよ。
解答例¶
(1.4.1.) 複素数の$j$を1j
ではなく、j
としてしまう間違いが多いので注意しよう。
import numpy as np
theta = np.pi/2
print(np.exp(1j*theta))
print(np.cos(theta) + 1j*np.sin(theta))
両辺とも同じ答えになっているが、実部は6.12...e-17
となっていて、厳密解である$0$にはなっていない。これは数値計算で必ず問題となる誤差で、詳細については今後取り上げる。
(1.4.2.) $i^i$は多価関数なので、無限の数列となる。ただしpytonでそのまま表現すると単純に主値が求まる。
x = 1j**1j
print(x)
となって、確かに虚部が$0$になっている。
当サイトのテキスト・画像の無断転載・複製を固く禁じます。
Unauthorized copying and replication of the contents of this site, text and images are strictly prohibited.
© 2019 Go Yusa