『Pythonからはじめる数学入門』
5章 集合と確率を操作する
の解説です。
5.1 集合とは何か
集合(set)、要素(element)といったキーワードの意味は、高校数学で出てきていますのでここでは省略します。
以下、Pythonで集合の演算方法をみていきます。
5.1.1 集合の構成
まず、集合は、sympyのFiniteSetをimportして構成します。
from sympy import FiniteSet s = FiniteSet(2,4,6) print(s)
結果
{2, 4, 6} # {} は集合を意味します
集合は、さまざまな要素をもつことができ、要素の個数は、len()で求められます。
from sympy import FiniteSet from fractions import Fraction s = FiniteSet(1,1.5, Fraction(1,5)) # さまざな数を要素にもてる print(s) print(len(s)) # 集合の濃度(cardinality)=要素の個数は、len()で求める
結果
{1/5, 1, 1.5} 3
集合の要素かどうかの判定方法は、in でチェックできます。
#5.1.1.1 要素判定 print(1 in s) print(4 in s)
結果
True False
また、空集合をつくる方法です。
#5.1.1.2 空集合を作る
s = FiniteSet()
s
結果
EmptySet()
リストやタプルから集合を作る場合は、可変長引数として渡します。
#5.1.1.3 リストやタプルから集合を作る members = [1,2,3] s = FiniteSet(*members) #*:可変長引数 s
結果
{1, 2, 3}
集合要素の重複は、取り除かれます。
#5.1.1.4 集合要素の重複と順序 from sympy import FiniteSet members = [1,2,3,2] FiniteSet(*members)
結果
{1, 2, 3}
また、順序は、一定になるとは限りません。
from sympy import FiniteSet s = FiniteSet(1,2,3) for member in s: print(member)
結果
1 2 3
集合が等しいかは、==で比較します。
from sympy import FiniteSet s = FiniteSet(3,4,5) t = FiniteSet(3,4,5) s == t
結果
True
5.1.2 部分集合、上位集合、べき集合
一方の集合Aが、他方の集合Bに含まれる場合は、AはBの部分集合subsetといい、
その逆からみれば、BはAの上位集合supersetといいます。
また、完全に含まれている場合は、真部分集合proper subsetといい、逆は真上位集合proper supersetといいます。
#5.1.2 部分集合、上位集合、べき集合 s = FiniteSet(1) t = FiniteSet(1,2) print('subset') print(s.is_subset(t)) print(t.is_subset(s)) print(s.is_subset(s)) print(t.is_subset(t)) print('superset') print(s.is_superset(t)) print(t.is_superset(s)) print(s.is_superset(s)) print(t.is_superset(t)) print('proper_subset') print(s.is_proper_subset(t)) print(t.is_proper_subset(s)) print(s.is_proper_subset(s)) print(t.is_proper_subset(t)) print('proper_superset') print(s.is_proper_superset(t)) print(t.is_proper_superset(s)) print(s.is_proper_superset(s)) print(t.is_proper_superset(t))
結果
subset True False True True superset False True True True proper_subset True False False False proper_superset False True False False
集合sのべき集合power setとは、sのすべての部分集合の集合を意味します。
s = FiniteSet(1,2,3) ps = s.powerset() print(ps) print(len(ps))
結果
{EmptySet(), {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}} 8
5.1.3 集合演算
2つの集合の和union、積intersection、直積Cartesian productの演算は以下の通りです。
from sympy import FiniteSet s = FiniteSet(1,3) t = FiniteSet(3,6) print('union') print(s.union(t)) print('intersect') print(s.intersect(t)) print('Cartesian product') print(s*t) for elem in s*t: print(elem) print(s**3) for elem in s**3: print(elem)
結果
union {1, 3, 6} intersect {3} Cartesian product {1, 3} x {3, 6} (1, 3) (1, 6) (3, 3) (3, 6) {1, 3} x {1, 3} x {1, 3} (1, 1, 1) (1, 1, 3) (1, 3, 1) (1, 3, 3) (3, 1, 1) (3, 1, 3) (3, 3, 1) (3, 3, 3)