2次方程式の解

2次方程式の解は、以下のようにします。

>>> def roots(a, b, c):
...   D = (b * b - 4 * a * c) ** 0.5
...   x_1 = (-b + D) / (2 * a)
...   x_2 = (-b - D) / (2 * a)
...   return {'x1':x_1, 'x2':x_2}

>>> # x**2 + 5x + 4 = 0の解

>>> roots(1, 5, 4)

{'x1': -1.0, 'x2': -4.0}



>>> # x**2 + 5x + 6 = 0の解
>>> roots(1, 5, 6)
{'x1': -2.0, 'x2': -3.0}

sympyを使えばもっと簡単に求められます。
以下の例では、解答を辞書形式で出力したり、ax2+bx+cの様な式でも解答が得られる例も示してあります。
from sympy import Symbol, solve
x = Symbol('x')
expr = x**2 + 5*x + 4
s = solve(expr)
print(s)

# dict=Trueで解答を辞書形式で返却してくれる
d = solve(expr, dict=True)
print(d)

# ax**2+bx+cみたいな式も対応可能
x = Symbol('x')
a = Symbol('a')
b = Symbol('b')
c = Symbol('c')
expr = a*x**2 + b*x + c
# xの解を得る
d = solve(expr, x, dict=True)
print(d)

摂氏⇄華氏変換

華氏を摂氏に変換するには、以下のようにします。
>>> def fahrenheit2celsius(fahrenheit):
...   return (fahrenheit - 32) * (5 / 9)
>>> fahrenheit2celsius(100)
37.77777777777778

摂氏を華氏に変換するには、以下のようにします。
>>> def celsius2fahrenheit(celsius):
...   return celsius * (9 / 5) + 32
>>> celsius2fahrenheit(37.777777777778)
100.0000000000004



キロメートル⇄マイル変換

1マイルは約1.609キロメートルなので、以下のようにします。
>>> def mile2km(mile):
...   return mile * 1.609
>>> mile2km(650)
1045.85

また、キロメートルをマイルに変換するには、以下のようにします。
>>> def km2mile(km):
...   return km / 1.609
>>> km2mile(1045.85)

650.0


メートル⇄インチ変換

メートルをインチに変換するには、以下のようにします。
>>> def m2inch(m):
...   return (m * 100) / 2.54

>>> m2inch(0.647699999999999)
25.499999999999964

また、インチをメートルにするには、以下のようにします。
>>> def inch2m(inch):
...   return (inch * 2.54) /100

>>> inch2m(25.5)
0.6476999999999999




因数の判定

aがbで割り切れる場合、bはaの因数です。

以下の例は、2と3がそれぞれ123の因数かを出力します。
>>> def is_factor(a, b):
...   if a % b == 0:
...     return True
...   else:
...     return False
... 
>>> is_factor(123, 2)
False
>>> is_factor(123, 3)

True
123は2で割り切れないので2は123の因数ではありません。
123は3で割り切れるので3は123の因数です。

以下の例は、1〜123までの因数を出力します。
>>> # 1〜123の因数のみ出力
>>> [n for n in range(1, 123) if is_factor(123, n)]

[1, 3, 41]



リストの2乗

リスト内の要素をそれぞれ2乗するには、以下のようにします。

>>> list = [1, 2, 3, 4, 5]
>>> result = []
>>> for n in list:
...   result.append(n**2)
... 
>>> print(result)

[1, 4, 9, 16, 25]

リスト内包表記(list comprehensions)を使えばもっと短く書けます。
>>> list = [1, 2, 3, 4, 5]
>>> result = [n ** 2 for n in list]
>>> print(result)
[1, 4, 9, 16, 25]



組み合わせ

組み合わせ5C2は、以下のようにして求めます。
>>> import itertools
>>> list(itertools.combinations(data, 2))
[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]

組み合わせの数だけ分かれば良い場合は、
>>> len(list(itertools.combinations(data, 2)))
10

または、実際の組み合わせを生成しなくて良い場合は、
>>> import math
>>> math.factorial(len(data)) / (math.factorial(len(data) - 2) * math.factorial(2))
10.0

で求められます。

順列

順列は、itertoolsを使います。

例えば、5個中1個を選ぶ順列5P1は、
>>> # 5個中1個選ぶ順列
>>> import itertools

>>> data = (1, 2, 3, 4, 5)

>>> list(itertools.permutations(data))

[(1, 2, 3, 4, 5), (1, 2, 3, 5, 4), (1, 2, 4, 3, 5), (1, 2, 4, 5, 3), (1, 2, 5, 3, 4), (1, 2, 5, 4, 3), (1, 3, 2, 4, 5), (1, 3, 2, 5, 4), (1, 3, 4, 2, 5), (1, 3, 4, 5, 2), (1, 3, 5, 2, 4), (1, 3, 5, 4, 2), (1, 4, 2, 3, 5), (1, 4, 2, 5, 3), (1, 4, 3, 2, 5), (1, 4, 3, 5, 2), (1, 4, 5, 2, 3), (1, 4, 5, 3, 2), (1, 5, 2, 3, 4), (1, 5, 2, 4, 3), (1, 5, 3, 2, 4), (1, 5, 3, 4, 2), (1, 5, 4, 2, 3), (1, 5, 4, 3, 2), (2, 1, 3, 4, 5), (2, 1, 3, 5, 4), (2, 1, 4, 3, 5), (2, 1, 4, 5, 3), (2, 1, 5, 3, 4), (2, 1, 5, 4, 3), (2, 3, 1, 4, 5), (2, 3, 1, 5, 4), (2, 3, 4, 1, 5), (2, 3, 4, 5, 1), (2, 3, 5, 1, 4), (2, 3, 5, 4, 1), (2, 4, 1, 3, 5), (2, 4, 1, 5, 3), (2, 4, 3, 1, 5), (2, 4, 3, 5, 1), (2, 4, 5, 1, 3), (2, 4, 5, 3, 1), (2, 5, 1, 3, 4), (2, 5, 1, 4, 3), (2, 5, 3, 1, 4), (2, 5, 3, 4, 1), (2, 5, 4, 1, 3), (2, 5, 4, 3, 1), (3, 1, 2, 4, 5), (3, 1, 2, 5, 4), (3, 1, 4, 2, 5), (3, 1, 4, 5, 2), (3, 1, 5, 2, 4), (3, 1, 5, 4, 2), (3, 2, 1, 4, 5), (3, 2, 1, 5, 4), (3, 2, 4, 1, 5), (3, 2, 4, 5, 1), (3, 2, 5, 1, 4), (3, 2, 5, 4, 1), (3, 4, 1, 2, 5), (3, 4, 1, 5, 2), (3, 4, 2, 1, 5), (3, 4, 2, 5, 1), (3, 4, 5, 1, 2), (3, 4, 5, 2, 1), (3, 5, 1, 2, 4), (3, 5, 1, 4, 2), (3, 5, 2, 1, 4), (3, 5, 2, 4, 1), (3, 5, 4, 1, 2), (3, 5, 4, 2, 1), (4, 1, 2, 3, 5), (4, 1, 2, 5, 3), (4, 1, 3, 2, 5), (4, 1, 3, 5, 2), (4, 1, 5, 2, 3), (4, 1, 5, 3, 2), (4, 2, 1, 3, 5), (4, 2, 1, 5, 3), (4, 2, 3, 1, 5), (4, 2, 3, 5, 1), (4, 2, 5, 1, 3), (4, 2, 5, 3, 1), (4, 3, 1, 2, 5), (4, 3, 1, 5, 2), (4, 3, 2, 1, 5), (4, 3, 2, 5, 1), (4, 3, 5, 1, 2), (4, 3, 5, 2, 1), (4, 5, 1, 2, 3), (4, 5, 1, 3, 2), (4, 5, 2, 1, 3), (4, 5, 2, 3, 1), (4, 5, 3, 1, 2), (4, 5, 3, 2, 1), (5, 1, 2, 3, 4), (5, 1, 2, 4, 3), (5, 1, 3, 2, 4), (5, 1, 3, 4, 2), (5, 1, 4, 2, 3), (5, 1, 4, 3, 2), (5, 2, 1, 3, 4), (5, 2, 1, 4, 3), (5, 2, 3, 1, 4), (5, 2, 3, 4, 1), (5, 2, 4, 1, 3), (5, 2, 4, 3, 1), (5, 3, 1, 2, 4), (5, 3, 1, 4, 2), (5, 3, 2, 1, 4), (5, 3, 2, 4, 1), (5, 3, 4, 1, 2), (5, 3, 4, 2, 1), (5, 4, 1, 2, 3), (5, 4, 1, 3, 2), (5, 4, 2, 1, 3), (5, 4, 2, 3, 1), (5, 4, 3, 1, 2), (5, 4, 3, 2, 1)]

上のようにすると全ての並び順が出ますが、実際に並べたものじゃなくて並べた場合の数だけ知りたい時は以下のようにします。
len(list(itertools.permutations(data)))
120

または、mathを使えば実際の順列は生成されずに数だけ分かります。
>>> import math
>>> math.factorial(len(data))
120

5P2は以下のようにします。
>>> list(itertools.permutations(data, 2))
[(1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 4), (3, 5), (4, 1), (4, 2), (4, 3), (4, 5), (5, 1), (5, 2), (5, 3), (5, 4)]

同じく、数だけ知りたい時は、
>>> len(list(itertools.permutations(data, 2)))
20

実際の順列を生成したくない場合は、mathを使って、
>>> math.factorial(len(data)) / math.factorial(len(data) - 2)
20.0

とすれば求められます。





階乗

階乗は、math.factorialで求められます。

例えば、5!(=5 x 4 x 3 x 2 x 1)は以下のようにします。
>>> import math
>>> math.factorial(5)

120

math.factorialを使わないで行う場合は以下のようにします。
>>> fac = 1
>>> for i in range(1, 5 + 1):
...   fac = fac * i
... 
>>> print(fac)

120


複素数の大きさ

複素数の大きさは、実部の2乗+虚部の2乗を二乗根すれば求まります。

>>> C=(2+3j)
>>> (C.real**2+C.imag**2)**0.5
3.605551275463989

>>> C=complex(2, 3)
>>> (C.real**2 + C.imag**2)**0.5

3.605551275463989

また、abs関数でも同じことができます。
>>> C=(2+3j)
>>> abs(C)
3.605551275463989


共役複素数

複素数の、実部が同じで虚部の符号が異なるものを共役複素数といいます。

>>> (2+3j).conjugate()
(2-3j)
>>> complex(2, 3).conjugate()

(2-3j)

2+3iの共役複素数は、2-3iです。



複素数

複素数はj、または、complexで表します。
なぜjなのかというと、iは一般的に電流を表す記号として使われているからだそうです。

2+3i
>>> 2+3j
(2+3j)
>>> (2+3j)**2

(-5+12j)
(2+3i)の2乗をすると、
4 + 12i + (-9)となるので、
答えは-5 + 12iとなり、上の結果となります。

上と同じことは、以下の書き方でもできます。
>>> complex(2, 3)
(2+3j)
>>> complex(2, 3)**2
(-5+12j)

ちなみに、複素数の型は、
>>> type(2+3j)
<class 'complex'>

>>> type(complex(2, 3))
<class 'complex'>
となり、complex(複素数)となります。

複素数の計算には剰余(%)と床除算(//)は使えません。
実部を取得するには、realを使います。
>>> (2+3j).real
2.0
>>> complex(2, 3).real
2.0

また、虚部を取得するには、imagを使います。
>>> (2+3j).imag
3.0
>>> complex(2, 3).imag
3.0




分数

pythonでは分数を扱うライブラリが標準で用意されています。

3/4を分数で表す時は、Fraction(3, 4)とします。

以下、分数の例です。
>>> from fractions import Fraction
>>> f = Fraction(3, 4)
>>> f
Fraction(3, 4)
>>> f+1
Fraction(7, 4)
>>> f+2

Fraction(11, 4)

4分の3に1を足すと、4分の7になり、2を足すと4分の11になってることが分かります。



型を得る

pythonでは、typeで型を取得できます。

>>> type(1)
<class 'int'>
>>> type(1.0)
<class 'float'>
>>> type('1')

<class 'str'>


除算の結果を整数にする

除算の結果は通常は少数で返却されますが、以下のようにすると整数で返却されます。(少数以下切り捨て)

通常の除算
>>> 5/3
1.6666666666666667

# 答えが整数でも少数で返却される
>>> 4/2
2.0

除算の結果を整数で得る
>>> 5//3

1

>>> 4//2
2

ただし、-3を2で割るなど、除算結果がマイナスになる場合、除算の結果を超えない値が返却されます。
>>> -3/2
-1.5
普通の除算では-3割る2の答えは-1.5ですが、整数で返却するように//で除算すると、
>>> -3//2
-2
になります。
これは、-1.5より小さい整数を返却する為です。
//の除算は、ここら辺が少し紛らわしいかもしれません。





リストからのランダム選択

リストからランダムに選択するには、numpyrandom.choiceを使用します。

>>> import numpy as np
>>> data = np.array([1,2,3,4,5,6,7])
>>> np.random.choice(data)
6
>>> np.random.choice(data)
4
>>> np.random.choice(data)
1


標準偏差

標準偏差は、分散の累乗根を求めることで得られます。

>>> import numpy as np
>>> data = np.array([1,2,3,4,5,6,7])
>>> # 分散を求める
>>> dispersion = ((data - data.mean()) ** 2).sum() / len(data)
>>> np.sqrt(dispersion)
2.0

dispersionが分散。標準偏差は2.0になります。


分散

分散は、データのばらつき具合を表します。


>>> import numpy as np
>>> data = np.array([1,2,3,4,5,6,7])
>>> ((data - data.mean()) ** 2).sum() / len(data)

4.0

偏差の二乗和を求め、データ数で除算します。



平均

numpyの平均値取得は、averagemeanを使います。
averageは、データの各要素に重みをつけられます。
meanは重みをつけられません。

meanで平均を出す
import numpy as np
data = np.array([1,2,3,4,5,6,7])
np.mean(data)
# 4.0が出力されます。

averageで平均を出す
import numpy as np


data = np.array([1,2,3,4,5,6,7])
w = np.array([1, 1.5, 10.3, 4, 2, 1, 3])
np.average(data, weights=w)

# 3.855263157894737が出力されます。