Intro to Python
数学
最終更新:
introtopython
目次
絶対値を求める
abs関数を使う。mathモジュールの関数ではなく、組み込み関数であることに注意。
平方根を求める
mathモジュールのsqrt関数を使う。
>>> import math
>>> math.sqrt(2)
1.4142135623730951
>>> math.sqrt(3)
1.7320508075688772
>>> math.sqrt(4)
2.0
>>> math.sqrt(-2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: math domain error累乗を求める
**演算子かpow関数を使う。pow関数はmathモジュールの関数ではなく、組み込み関数であることに注意。
>>> 2 ** 3
8
>>> 2 ** 0.5
1.4142135623730951
>>> 2 ** -4
0.0625
>>> -3 ** 3
-27
>>> pow(2, 3)
8
>>> pow(2, 0.5)
1.4142135623730951
>>> pow(2, -4)
0.0625
>>> pow(-3, 3)
-27等差数列を作成する
numpyのlinspaceメソッドを使う。
>>> import numpy as np
>>> print(np.linspace(0, 12, 2))
[ 0. 12.]
>>> print(np.linspace(0, 12, 3))
[ 0. 6. 12.]
>>> print(np.linspace(0, 12, 4))
[ 0. 4. 8. 12.]
>>> print(np.linspace(0, 12, 5))
[ 0. 3. 6. 9. 12.]
>>> print(np.linspace(0, 12, 6))
[ 0. 2.4 4.8 7.2 9.6 12. ]等差数列を作成する
numpyモジュールのarange関数を使う。戻り値はndarrayクラス。初項1、公差2、末項9の等差数列を求めてみる。arangeの第二引数には、「末項+1」の値を指定する必要があることに注意。
>>> import numpy as np
>>> type(np.arange(1, 9 + 1, 2))
<class 'numpy.ndarray'>
>>> np.arange(1, 9 + 1, 2)
array([1, 3, 5, 7, 9])
>>> n = np.arange(1, 9 + 1, 2)
>>> n[0]
1
>>> print(n)
[1 3 5 7 9]
>>> type(n[0])
<class 'numpy.int32'>以下の例のとおり第二引数の値を超えない値まで項が求まり、小数を指定することもできる。三つの値の組合せで項数が0となるような場合は何も返さない。公差に負数を指定することもできる。引数に与えた数値リテラルによって戻り値の型が自動で決まることに注意。
>>> np.arange(2.2, 3.3, 0.2)
array([2.2, 2.4, 2.6, 2.8, 3. , 3.2])
>>> d = np.arange(2.2, 3.3, 0.2)
>>> type(d[1])
<class 'numpy.float64'>
>>> np.arange(1, 10 + 1, 2)
array([1, 3, 5, 7, 9])
>>> np.arange(20, 10, 2)
array([], dtype=int32)
>>> np.arange(20, 10, -1)
array([20, 19, 18, 17, 16, 15, 14, 13, 12, 11])逆双曲線関数を使う
mathモジュールのasinh関数(逆双曲線正弦)、acosh関数(逆双曲線余弦)、atanh関数(逆双曲線正接)をそれぞれ使う。以下、動作例。
スクリプト
import math
d = [-0.8, -0.4, 0, 0.4, 0.8]
for i in range(len(d)):
print(f"asinh({d[i]:4}) = {math.asinh(d[i])}")
d = [1, 2, 3, 4, 5]
for i in range(len(d)):
print(f"acosh({d[i]:4}) = {math.acosh(d[i])}")
d = [-0.8, -0.4, 0, 0.4, 0.8]
for i in range(len(d)):
print(f"atanh({d[i]:4}) = {math.atanh(d[i])}")画面出力
asinh(-0.8) = -0.732668256045411
asinh(-0.4) = -0.39003531977071526
asinh( 0) = 0.0
asinh( 0.4) = 0.39003531977071526
asinh( 0.8) = 0.732668256045411
acosh( 1) = 0.0
acosh( 2) = 1.3169578969248166
acosh( 3) = 1.762747174039086
acosh( 4) = 2.0634370688955608
acosh( 5) = 2.2924316695611777
atanh(-0.8) = -1.0986122886681098
atanh(-0.4) = -0.42364893019360184
atanh( 0) = 0.0
atanh( 0.4) = 0.42364893019360184
atanh( 0.8) = 1.0986122886681098自然対数の底eの累乗を求める
mathパッケージのexp関数か、numpyパッケージのexp関数を使う。後者はリストやndarray型を扱うことができる。
>>> import math
>>> math.exp(1)
2.718281828459045
>>> ary = [-1, 0, 1, 2]
>>> math.exp(ary)
Traceback (most recent call last):
File "<python-input-21>", line 1, in <module>
math.exp(ary)
~~~~~~~~^^^^^
TypeError: must be real number, not list
>>> [math.exp(d) for d in ary]
[0.36787944117144233, 1.0, 2.718281828459045, 7.38905609893065]
>>> math.e
2.718281828459045
>>> import numpy as np
>>> np.exp(1)
np.float64(2.718281828459045)
>>> np.exp(ary)
array([0.36787944, 1. , 2.71828183, 7.3890561 ])
>>> np.e
2.718281828459045mathパッケージとnumpyパッケージには、組み込み定数として自然対数の底e(=2.718 281 828 459 045 235…)が組み込まれている。
平均を求める
numpyパッケージのmean関数を使う。
>>> import numpy as np
>>> x = np.array(range(1, 19))
>>> print(x)
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18]
>>> np.sum(x) / x.size
np.float64(9.5)
>>> np.mean(x)
np.float64(9.5)分散を求める
numpyパッケージのvar関数を使う。var関数は引数に与えたndarray型の配列の要素の標本分散(算術平均からの偏差の平方和(偏差平方和)を標本数で割った値)を返す。不偏分散(偏差平方和を「標本数-1」で割った値)を得るには、ddofオプションに1を指定するか以下のように関数を自作する必要がある。
>>> import numpy as np
>>> x = np.array(range(1, 19))
>>> print(x)
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18]
>>> np.sum((x - np.mean(x)) ** 2) / x.size
np.float64(26.916666666666668)
>>> np.var(x)
np.float64(26.916666666666668)
>>> np.sum((x - np.mean(x)) ** 2) / (x.size - 1)
np.float64(28.5)
>>> np.var(x, ddof = 1)
np.float64(28.5)
>>> uvar = lambda x: x.size / (x.size - 1) * np.var(x)
>>> uvar(x)
np.float64(28.5)標準偏差を求める
numpyパッケージのstd関数を使う。std関数は引数に与えたndarray型の配列の要素の標本分散(算術平均からの偏差の平方和(偏差平方和)を標本数で割った値)の平方根を返す。不偏分散(偏差平方和を「標本数-1」で割った値)の平方根を得るには、ddofオプションに1を指定するか以下のように関数を自作する必要がある。
>>> import numpy as np
>>> x = np.array(range(1, 19))
>>> print(x)
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18]
>>> np.sqrt(np.sum((x - np.mean(x)) ** 2) / x.size)
np.float64(5.188127472091127)
>>> np.std(x)
np.float64(5.188127472091127)
>>> np.sqrt(np.sum((x - np.mean(x)) ** 2) / (x.size - 1))
np.float64(5.338539126015656)
>>> np.std(x, ddof = 1)
np.float64(5.338539126015656)
>>> ustd = lambda x: np.sqrt(x.size / (x.size - 1) * np.var(x))
>>> ustd(x)
np.float64(5.338539126015656)複数の文字列による重複順列を作成する
複数の文字列による重複順列とは、与えられた複数の文字列から、同じものを繰り返し取ることを許して取って並べた順列のこと。なお、重複順列は数学では正しくは「n個からr個とった重複順列」(n≧r)という。
以下の例では、与えれたn個の文字列からn個とった重複順列を求めている。例として'A'と'B'の2つの文字列であれば、'AA', 'AB', 'BA', 'BB'の4個の文字列を作成するということ。'A', 'B', 'C'の3つであれば、'AAA', 'AAB', 'AAC', 'ABA', …, 'CCB', 'CCC'の27個となる。
itertoolsモジュールのproduct関数を使えばよい。
>>> import itertools
>>> letters = ['A', 'B']
>>> n = len(letters)
>>> ss = [None] * n ** n
>>> for n, elem in enumerate(itertools.product(letters, repeat = n)):
... ss[n] = ''.join(elem)
...
>>> print(ss)
['AA', 'AB', 'BA', 'BB']
>>> letters = ['A', 'B', 'C']
>>> n = len(letters)
>>> ss = [None] * n ** n
>>> for n, elem in enumerate(itertools.product(letters, repeat = n)):
... ss[n] = ''.join(elem)
...
>>> len(ss)
27
>>> import pprint
>>> pprint.pprint(ss, compact = True)
['AAA', 'AAB', 'AAC', 'ABA', 'ABB', 'ABC', 'ACA', 'ACB', 'ACC', 'BAA', 'BAB',
'BAC', 'BBA', 'BBB', 'BBC', 'BCA', 'BCB', 'BCC', 'CAA', 'CAB', 'CAC', 'CBA',
'CBB', 'CBC', 'CCA', 'CCB', 'CCC']