ラベル 標準ライブラリ の投稿を表示しています。 すべての投稿を表示
ラベル 標準ライブラリ の投稿を表示しています。 すべての投稿を表示

2022年4月29日金曜日

【標準ライブラリ】collections.Counterによる要素の出現回数カウント

 標準ライブラリcollectionsCounterを用いると要素の出現回数がカウントできる。戻り値はキーが要素、値が出現回数の辞書型のカウンターオブジェクトとなる。カウンターオブジェクトに対してカウンタツールmost_commonを適用すると出現回数が多い順に並べ替えることができる。

ライブラリcollectionsを使う際にはimportが必要。

import collections

又は以下のようにCounterをimportする。

from collections import Counter




1. collections.Counterによる要素の出現回数カウント

 Counterの引数にリストを与えるとキーが要素、値が出現回数の辞書型のカウンターオブジェクトが生成される。

from collections import Counter

a = [10, 50, 70, 30, 30, 50, 70, 20, 30, 10, 10, 30]
c = Counter(a)
print(c)

実行結果

Counter({10: 3, 50: 2, 70: 2, 30: 4, 20: 1})


from collections import Counter

a = ['10', '50', '70', '30', '30', '50', '70', 
     '20', '30', '10', '10', '30']
c = Counter(a)
print(c)

実行結果

Counter({'10': 3, '50': 2, '70': 2, '30': 4, '20': 1})


2. most_commonによる出現回数順の並べ替え

 カウンターオブジェクトに対して、most_common()メソッドを適用することで、出現回数が多い順にキーと値が並べ替えられる。

from collections import Counter

a = ['10', '50', '70', '30', '30', '50', '70', 
     '20', '30', '10', '10', '30']
c = Counter(a)
print(c.most_common())

実行結果

[('30', 4), ('10', 3), ('50', 2), ('70', 2), ('20', 1)]


 most_common()メソッドの引数に個数を指定すると、出現回数が多い順に指定した個数だけ求められる。

from collections import Counter

a = ['10', '50', '70', '30', '30', '50', '70', 
     '20', '30', '10', '10', '30']
c = Counter(a)
print(c.most_common(3))

実行結果

[('30', 4), ('10', 3), ('50', 2)]


2. リファレンス

Python 標準ライブラリ > collections --- コンテナデータ型 > class collections.Counter([iterable-or-mapping])
Python 標準ライブラリ > collections --- コンテナデータ型 > most_common([n])

使用バージョン:Python 3.9.12

2022年4月17日日曜日

【標準ライブラリ】datetimeによる現在日時の取得

 標準ライブラリdatetimeを用いると現在日時が取得できる。

ライブラリdatetimeを使う際にはimportが必要。

import datetime




1. date/datetimeオブジェクト

 datetime.dateオブジェクトは年・月・日、datetime.datetimeオブジェクトは年・月・日・時・分・秒・マイクロ秒からなり、これらのオブジェクトに現在日時を取得するメソッドを適用することで現在日時が取得できる。また取得した現在日時に、年・月・日などの項目に対応する属性を適用することで、年・月・日などを個別に取得できる
 取得可能な項目と属性、取りうる範囲は以下表のとおり

項目 属性 範囲
西暦 year 1-9999
month 1-12
day 1-31(月により28,29,30)
hour 0-23
minute 0-59
second 0-59
マイクロ秒 microsecond 0-999999


2. date.today()による現在日時の取得

datetime.dateオブジェクトに対して、today()メソッドを適用することで現在の年・月・日を取得できる。

import datetime

print(datetime.date.today())

実行結果

2022-04-29


today()メソッドによる戻り値はdatetime.date型。

import datetime

print(type(datetime.date.today()))

実行結果

<class 'datetime.date'>


today()メソッドを適用し、属性yearmonthdayを指定すると、現在の年・月・日を個別に取得できる。

import datetime

print(datetime.date.today().year)

実行結果

2022


個別に取得した年・月・日はint型になる。

import datetime

print(type(datetime.date.today().year))

実行結果

<class 'int'>


3. datetime.now()/datetime.today()による現在日時の取得

datetime.datetimeオブジェクトに対して、today()メソッドを適用することで現在の年・月・日・時・分・秒・マイクロ秒を取得できる。

import datetime

datetime.datetime.today()

実行結果

2022-4-17 10:7:17.785741)


today()メソッドによる戻り値はdatetime.datetime型。

import datetime

print(type(datetime.datetime.today()))

実行結果

<class 'datetime.datetime'>


now()メソッドでも同様に現在の年・月・日・時・分・秒・マイクロ秒を取得できる。

import datetime

print(datetime.datetime.now())

実行結果

2022-4-17 10:43:58.512176)


today()メソッドを適用し、属性yearmonthdayhourminutesecondmicrosecondを指定すると、現在の年・月・日・時・分・秒・マイクロ秒を個別に取得できる。

import datetime

print(datetime.datetime.today().minute)

実行結果

46


個別に取得した属性値はint型になる。

import datetime

print(type(datetime.datetime.today().minute))

実行結果

<class 'int'>


4. strftimeによる現在日時の文字列化

strftime()メソッドを適用することで、date、datetimeオブジェクトの値を指定した書式の文字列として取得できる。書式の指定はC89で制定された書式コードを用いる。多数の書式コードがあるが代表的なものは以下。

書式コード 内容 戻り値の例
%Y 0埋めした西暦4桁 2022
%m 0埋めした月 04
%d 0埋めした日 07
%H 0埋めした時 09
%M 0埋めした分 39
%S 0埋めした秒 55
%a 曜日短縮形 Mon
%b 月名短縮形 Dec


datetime.now()メソッドで取得した現在日時にstrftime()メソッドを適用する例。年月日時分秒が文字列で取得される。

import datetime

print(datetime.datetime.now().strftime('%Y%m%d%H%M%S'))

実行結果

20220417112401


strftime()メソッドの書式として、書式コードと通常の文字を混在させることで任意の書式を作成可能。

import datetime

print(datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S'))

実行結果

'2022-04-17-11-43-07'


5. リファレンス

Python 標準ライブラリ > datetime --- 基本的な日付型および時間型 > date オブジェクト
Python 標準ライブラリ > datetime --- 基本的な日付型および時間型 > datetime オブジェクト
Python 標準ライブラリ > datetime --- 基本的な日付型および時間型 > classmethod datetime.today()
Python 標準ライブラリ > datetime --- 基本的な日付型および時間型 > classmethod datetime.now(tz=None)
Python 標準ライブラリ > datetime --- 基本的な日付型および時間型 > strftime() と strptime() の振る舞い

使用バージョン:Python 3.8.12

2021年7月3日土曜日

【標準ライブラリ】itertoolsによる順列・組合せの作成

標準ライブラリitertoolsを用いると要素の組み合わせが作成できる。

ライブラリitertoolsを使う際にはimportが必要。

import itertools


1. productによる要素の積(デカルト積)の作成

productは集合と集合のデカルト積(直積)を求める。
productproductの戻り値はイテレータオブジェクトなので組み合わせパターンを求めるにはlistでリスト化する。

import itertools

x = ['A','B','C']
y = [1, 2]
list(itertools.product(x, y))

実行結果

[('A', 1), ('A', 2), ('B', 1), ('B', 2), ('C', 1), ('C', 2)]


イテレータオブジェクト自身とのデカルト積を求める場合は引数repeatを指定する。itertools.product(x, repeat=2)とした場合はitertools.product(x, x)と同じ。順序も区別したすべての組み合わせが求められる。

import itertools

x = ['A','B','C']
list(itertools.product(x, repeat=2))

実行結果

[('A', 'A'),
 ('A', 'B'),
 ('A', 'C'),
 ('B', 'A'),
 ('B', 'B'),
 ('B', 'C'),
 ('C', 'A'),
 ('C', 'B'),
 ('C', 'C')]


repeat=3の場合。

import itertools

x = ['A','B','C']
list(itertools.product(x, repeat=3))

実行結果

[('A', 'A', 'A'),
 ('A', 'A', 'B'),
 ('A', 'A', 'C'),
 ('A', 'B', 'A'),
 ('A', 'B', 'B'),
 ('A', 'B', 'C'),
 ('A', 'C', 'A'),
 ('A', 'C', 'B'),
 ('A', 'C', 'C'),
 ('B', 'A', 'A'),
 ('B', 'A', 'B'),
 ('B', 'A', 'C'),
 ('B', 'B', 'A'),
 ('B', 'B', 'B'),
 ('B', 'B', 'C'),
 ('B', 'C', 'A'),
 ('B', 'C', 'B'),
 ('B', 'C', 'C'),
 ('C', 'A', 'A'),
 ('C', 'A', 'B'),
 ('C', 'A', 'C'),
 ('C', 'B', 'A'),
 ('C', 'B', 'B'),
 ('C', 'B', 'C'),
 ('C', 'C', 'A'),
 ('C', 'C', 'B'),
 ('C', 'C', 'C')]


2. permutationsによる順列の作成

permutationsにより順列が求まる。順列を求める集合(リストなど)と選ぶ個数を指定する。選ぶ個数の指定が無ければ、集合の全ての要素で順列が作られる。

import itertools

x = ['A','B','C']
list(itertools.permutations(x))

実行結果

[('A', 'B', 'C'),
 ('A', 'C', 'B'),
 ('B', 'A', 'C'),
 ('B', 'C', 'A'),
 ('C', 'A', 'B'),
 ('C', 'B', 'A')]


要素数を指定すれば指定した要素数の順列が求まる。
要素数3のリストから2つの要素からなる順列を作る場合。

import itertools

x = ['A','B','C']
list(itertools.permutations(x, 2))

実行結果

[('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]


3. combinationsによる重複しない組み合わせ作成

combinationsにより集合から重複の無い組み合わせを作成する。要素数の指定が必要。
要素数3のリストから2つの要素の重複の無い組み合わせを作る場合。

import itertools

x = ['A','B','C']
list(itertools.combinations(x, 2))

実行結果

[('A', 'B'), ('A', 'C'), ('B', 'C')]


4. combinations_with_replacementによる重複を許容する組み合わせ作成

combinations_with_replacementは同じ要素の重複を許容して、指定した要素数の組み合わせを作成する。順序は区別されない。

import itertools

x = ['A','B','C']
list(itertools.combinations_with_replacement(x, 2))

実行結果

[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]


5. リファレンス

Python 標準ライブラリ > itertools --- 効率的なループ実行のためのイテレータ生成関数

使用バージョン:Python 3.7.0

2021年6月30日水曜日

【標準ライブラリ】randomによる要素の抽出・シャッフル

 標準ライブラリrandomchoicechoicessampleを用いるとリスト等から要素をランダムに抽出できる。また、shuffleにより要素をシャッフルできる。

ライブラリrandomを使う際にはimportが必要。

import random


1. ランダムに要素を抽出するchoice

 choiceはリストやタプルなどから要素を1つランダムに抽出する。

import random

x = [2, 5, 8, 9]
random.choice(x)

実行結果

8


 リストやタプルが空の場合はIndexErrorとなる。

import random

x = []
random.choice(x)

実行結果

IndexError: Cannot choose from an empty sequence


2. 複数の要素を重複ありで抽出するchoices

 choicesは母集団populationから重複ありで選んだ要素からなる大きさkのリストを返す。

random.choices(population, weights=None, *, cum_weights=None, k=1)

 要素7つのタプルから重複ありで要素4のリストを作る場合。

import random

x = (2, 5, 8, 9, 11, 15, 17)
random.choices(x, k=4)

実行結果

[8, 11, 8, 17]


 weightを指定すると要素ごとに選択する確率に重みを付けられる。weightはリストで指定してその要素数はpopulationの要素数と同じにする。
'A', 'B', 'C', 'D'を1倍、'E', 'F'を2倍、'G'を4倍の重みづけにした場合。確率の高い'G'が多く選ばれる。

import random

x = ('A', 'B', 'C', 'D', 'E', 'F', 'G')
random.choices(x, weights=[1,1,1,1,2,2,8], k=4)

実行結果

['G', 'G', 'G', 'D']


 cum_weightも同様に確率に重みを付けられる。リストの値は各要素の重みづけの累積値となる。
上の例と同じ、'A', 'B', 'C', 'D'を1倍、'E', 'F'を2倍、'G'を4倍の重みづけにする場合。

import random

x = ('A', 'B', 'C', 'D', 'E', 'F', 'G')
random.choices(x, cum_weights=[1,2,3,4,6,8,16], k=4)

実行結果

['E', 'F', 'G', 'G']


3. 複数の要素を重複なしで抽出するsample

 sampleは母集団populationから重複なしで選んだ要素からなる大きさkのリストを返す。
kの値はpopulationの要素数以下でないといけない。

random.sample(population, k, *)


 要素7つのタプルから重複なしで要素4のリストを作る場合。

import random

x = (2, 5, 8, 9, 11, 15, 17)
random.sample(x, k=4)

実行結果

[2, 9, 17, 8]


 samplerangeと組み合わせることで、連続する数の集合からランダムなサンプリングができる。
0~99の数字から10要素を重複なく選択する場合。

import random

random.sample(range(100), k=10)

実行結果

[3, 85, 90, 1, 4, 78, 21, 28, 51, 37]


4. 要素をランダムに並べ替えるshuffle

 shuffleは要素の順番をランダムに入れ替える。

random.shuffle(x[, random])


リストを並べ替える場合。

import random

x = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
random.shuffle(x)
x

実行結果

['C', 'A', 'F', 'D', 'E', 'G', 'B']


 タプルはイミュータブル(変更できない)のでshuffleするとエラーとなる。

import random

x = ('A', 'B', 'C', 'D', 'E', 'F', 'G')
random.shuffle(x)
x

実行結果

TypeError: 'tuple' object does not support item assignment


 タプルを並べ替える場合はsample(x, k=len(x))とする。

import random

x = ('A', 'B', 'C', 'D', 'E', 'F', 'G')
random.sample(x, k=len(x))

実行結果

['F', 'G', 'C', 'D', 'B', 'A', 'E']


5. リファレンス

Python 標準ライブラリ > random --- 擬似乱数を生成する > シーケンス用の関数

使用バージョン:Python 3.7.0

2020年7月11日土曜日

【標準ライブラリ】randomによる乱数生成

標準ライブラリrandomを用いると乱数が生成できる。様々な確率密度関数が用意されているが代表的なものについて説明する。

ライブラリrandomを使う際にはimportが必要。

import random




1. 一様な乱数を生成するrandom.random,random.uniform

random.randomは0.0以上1.0未満の浮動小数点乱数を生成する。引数は取らない。

import random
import matplotlib.pyplot as plt

x = []
for i in range(10000):
    x.append(random.random())

plt.hist(x,100)
plt.show()

実行結果



random.uniformは引数(a, b)を取り、a以上b以下またはb以上a以下の浮動小数点乱数を生成する。

import random
import matplotlib.pyplot as plt

x = []
for i in range(10000):
    x.append(random.uniform(100,200))

plt.hist(x,100)
plt.show()

実行結果




2. 正規分布乱数を生成するrandom.gauss

random.gaussは引数(mu, sigma)を取り、平均muと分散sigmaで求まる正規分布に応じた浮動小数点乱数を生成する。

import random
import matplotlib.pyplot as plt

x = []
for i in range(10000):
    x.append(random.gauss(5, 2))

plt.hist(x,100)
plt.show()

実行結果




3. ガンマ分布乱数を生成するrandom.gammavariate

random.gammavariateは引数(alpha, beta)を取り、形状母数alphaと尺度母数betaで求まる確率密度関数に応じたガウス分布を持つ浮動小数点乱数を生成する。alpha > 0, beta > 0 でなければならない。

alpha = 1, beta = 2 の場合

import random
import matplotlib.pyplot as plt

x = []
for i in range(10000):
    x.append(random.gammavariate(1, 2))

plt.hist(x,100)
plt.show()

実行結果




alpha = 3, beta = 2 の場合

import random
import matplotlib.pyplot as plt

x = []
for i in range(10000):
    x.append(random.gammavariate(3, 2))

plt.hist(x,100)
plt.show()

実行結果





4. 0~2πの範囲の乱数を生成するrandom.vonmisesvariate

random.vonmisesvariateはラジアンに相当する0~2πの範囲の乱数を生成しする。引数(mu, kappa)を指定する。muは平均、kappaは濃度パラメータで0以上でないといけない。kappaを0とした場合は0~2πの範囲で一様な分布となる。
mu = 3.14, kappa = 3 の場合。

import random
import matplotlib.pyplot as plt

x = []
for i in range(10000):
    x.append(random.vonmisesvariate(3.14, 3))

plt.hist(x,100)
plt.show()

実行結果



mu = 0, kappa = 0 の場合。

import random
import matplotlib.pyplot as plt

x = []
for i in range(10000):
    x.append(random.vonmisesvariate(0, 0))

plt.hist(x,100)
plt.show()

実行結果




5. 一様な整数乱数を生成するrandom.randrange,random.randint

random.randrangeは引数(start, stop, step)で指定した範囲の一様分布の整数乱数を生成する。stepは省略可能。またstopのみの指定も可能でその場合0からstopの一つ前の数までの範囲指定となる。
random.randintは引数(a, b)を指定しa以上b以下の範囲の一様分布の整数乱数を生成する。

random.randrangeでstop = 10のみ指定した場合

import random
import matplotlib.pyplot as plt

x = []
for i in range(10000):
    x.append(random.randrange(10))

plt.hist(x,100)
plt.show()

実行結果



random.randrangeでstart = 5, stop = 15, step = 3 を指定した場合。

import random
import matplotlib.pyplot as plt

x = []
for i in range(10000):
    x.append(random.randrange(5, 15, 3))

plt.hist(x,100)
plt.show()

実行結果



random.randintでa = -3, b = 3を指定した場合。

import random
import matplotlib.pyplot as plt

x = []
for i in range(10000):
    x.append(random.randint(-3, 3))

plt.hist(x,100)
plt.show()

実行結果




6. リファレンス

Python 標準ライブラリ > random --- 擬似乱数を生成する

使用バージョン:Python 3.7.0

2020年4月12日日曜日

【標準ライブラリ】数学関数math・指数関数と対数関数

 Pythonの標準ライブラリの数学関数mathによる指数関数・対数関数の計算について解説する。

ライブラリmathを使う際にはインポートが必要。

import math


1. 指数関数・対数関数の記述例

 10を底とした対数(常用対数)を求める場合はlog10を使用する。

import math

print(math.log10(100))

実行結果

2.0


 e(≈2.718281828459)を底とした対数(自然対数)を求める場合はlogを使用する。

import math

print(math.log(100))

実行結果

4.605170185988092


 2を底とした対数を求める場合はlog2を使用する。

import math

print(math.log2(100))

実行結果

6.643856189774724


 べき乗の計算。xのy乗はpow(x, y)で求める。

import math

print(math.pow(10, 2))

実行結果

100.0


 べき乗の計算はPython組み込み関数powでも同様に可能。また、演算子**でも可能。

import math

print(pow(10, 2))

実行結果

100

import math

print(10 ** 2)

実行結果

100


2. リファレンス

Python 標準ライブラリ > math --- 数学関数 > 指数関数と対数関数

使用バージョン:Python 3.7.0

【標準ライブラリ】数学関数math・三角関数

 Python標準ライブラリの数学関数ライブラリmathによる三角関数の計算について解説する。

ライブラリmathを使う際には以下のようにインポートが必要。

import math


1. 三角関数の記述例

 正弦(sin)を求めるsin。ラジアン単位の角度を与える。

import math

print(math.sin(0.2))

実行結果

0.19866933079506122


円周率πを使う際はpaiを用いる。
sin(π/2)を求める例。

import math

print(math.sin(math.pi/2))

実行結果

1.0


余弦(cos)を求めるcos

import math

print(math.cos(math.pi))

実行結果

-1.0


正接(tan)を求めるtan

import math

print(math.tan(math.pi/4))

実行結果

0.9999999999999999


逆三角関数は戻り値がラジアンとなる。
逆正弦(arcsin)を求めるasin

import math

print(math.asin(1))

実行結果

1.5707963267948966


逆余弦(arccos)を求めるacos

import math

print(math.acos(1))

実行結果

0.0


逆正接(arctan)を求めるatan

import math

print(math.atan(1))

実行結果

0.7853981633974483


2. リファレンス

Python 標準ライブラリ > math --- 数学関数 > 三角関数

使用バージョン:Python 3.7.0