기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

[python] 집합( Set)

집합(Set)

내용

집합(Set)의 특성과 생성

Set은 리스트, 튜플과 같이 여러 요소들을 그룹화하는 컬렉션(collection)이지만 사전형과 같이 요소들에 인덱스가 부여되지 않기 때문에 순서를 지정할 없습니다. 그러므로 인덱스를 사용하여 각 요소를 조작할 수 있는 시퀀스 객체가 아니지만 반복문 등으로 요소들을 하나씩 호출할 수 있으므로 이터러블(iterable) 객체 입니다. 다음 코드의 객체 x는 for 문을 사용하여 집합(set)의 각 요소를 하나씩 호출한 것입니다(시퀀스, 이터러블 참조).

x={1,2, 'python', 3}
for i in x:
    print(i)
1
2
3
python

다음 코드는 다른 집합 객체 y에 대해 반복문을 사용하여 요소들 각각을 호출한 것입니다. 호출된 요소의 순서는 작성된 객체의 순서와 차이를 보입니다. 즉, set형의 요소들은 인덱스를 가지지 않으므로 순서를 특정할 수 없습니다. 그러므로 요소의 호출은 랜덤으로 이루어집니다.

y={3,4,5,6, "python", (1,2,3), "a", 'cd'}; set
{(1, 2, 3), 3, 4, 5, 6, 'a', 'cd', 'python'}
for i in y:
    print(i)
3
4
5
6
(1, 2, 3)
python
cd
a

집합형 객체의 생성과 특성은 다음과 같습니다.

집합(set)
  • Set는 순서가 없는 콜렉션입니다.
  • 요소들을 중괄호({ })내에 포함시키거나 내장함수인 set() 클래스를 사용하여 생성합니다.
    • set() 클래스의 인수는 대괄호('[]'), 중괄호('{}'), 소괄호('()')로 그룹화하여 전달해야 합니다.
    • 각 요소는 콤마(,)로 구별합니다.
  • 집합형은 불변형이므로 가변형 객체인 리스트와 사전형은 집합의 요소가 될 수 없습니다. 이들을 제외한 정수, 실수, 문자, 그리고 튜플형 객체는 모두 요소가 될 수 있습니다.
  • 집합형은 불변형이므로 요소를 수정할 수 없습니다. 그러나 객체 자체의 교환, 삭제는 가능합니다.
  • 요소들의 중복은 허락되지 않습니다. 즉, 같은 요소들이 중복될 수 없습니다.
  • 합집합(union), 교집합(intersection), 차집합(symmetric difference)등의 연산을 적용할 수 있습니다.

중괄호를 사용하여 생성합니다.

set1={1,2,3}; set1
{1, 2, 3}

set(x) 함수를 사용하여 생성합니다. 이 경우 인수 x는 요소 각각을 호출할 수 있는 이터러블이어야 합니다. 그러므로 다음 코드와 같이 숫자 리터럴은 이 함수의 인수가 될 수 없습니다.

set2=set(1); set2
TypeError: 'int' object is not iterable
set2=set(1,2,3); set2
TypeError: set expected at most 1 argument, got 3

숫자 리터럴을 요소로 하는 리스트, 튜플, 집합 형식으로 전환하여 입력하는 것으로 집합객체를 생성할 수 있습니다.

set2=set([1]) ;set2
 {1}
set2=set([1,2,3]); set2 
 {1, 2, 3}
set2=set({1,2,3}); set2 
 {1, 2, 3}
set2=set((1,2,3)); set2
 {1, 2, 3}

위 객체 set1과 같이 단순히 중괄호를 사용하여 생성할 수 있습니다.

s={1}; s
{1}
set1={3,4,5,6, "python", (1,2,3)}
type(set1)
 set
set1
{(1, 2, 3), 3, 4, 5, 6, 'python'}

문자 또는 문자열은 각 문자를 호출할 수 있으므로 이터러블이므로 set() 함수의 인수가 될 수 있습니다. 특히 다음 코드의 결과와 같이 문자열은 각각의 문자로 구성된 컬렉터이므로 각 문자가 집합형 객체의 요소가 됩니다. 이 경우 역시 집합에서는 요소의 순서를 정할 수 없으므로 요소로서 문자의 배열은 무작위로 나타납니다.

set("a")
{'a'}
set("python")
{'h', 'n', 'o', 'p', 't', 'y'}

집합형은 특정한 요소(들)을 호출할 수 없으므로 요소를 수정, 치환 할 수 있는 방법이 없습니다. 즉, 수정할 수 없는 불변(immutable) 객체입니다. 그러므로 가변 객체인 리스트, 사전은 집합의 요소가 될 수 없습니다.

a={3,4,5,6, "python", (1,2,3), {'two':2}}; a
 ~~TypeError: unhashable type: 'dict'
a={3,4,5,6, "python", (1,2,3), [10,20,30]}; a
 ~~TypeError: unhashable type: 'list'

집합형의 대표적인 메소드

첨가와 삭제

set의 요소들은 인덱스가 부여되지 않으므로 각각을 호출할 수 없으므로 원칙적으로 각 요소를 치환, 수정 등은 실행되지 않습니다. 그러나 set형에 적용되는 여러 메소드들을 사용하여 새로운 값들을 첨가하거나 삭제할 수 있습니다(표 1).

표 1 집합형 첨가와 삭제를 위한 메서드
메서드 내용
s.add() set객체 s의 요소 하나를 첨가
s.update()set객체 s의 여러 요소들을 첨가
인수로 리스트, 튜플, 문자열, set을 인수로 전달
remove() 지정한 요소(들)을 삭제
객체가 포함하지 않은 요소(들)일 경우 에러를 발생
discard() remove()와 같음
포함된 요소가 아닐 경우라도 에러를 발생시키지 않음
pop() 요소 하나를 삭제
집합은 인덱스나 key가 없으므로 요소는 임의적으로 삭제
clear() 객체의 모든 요소(들)을 삭제
객체 자체의 삭제가 아님
s=set({2,3}); s
{2, 3}
s.add(12); s
{2, 3, 12}
s.update(["apple", "python"]); s
{12, 2, 3, 'apple', 'python'}
set1={3,4,5,6, "python", (1,2,3)}; set1
{(1, 2, 3), 3, 4, 5, 6, 'python'}
set1.remove('python'); set1
{(1, 2, 3), 3, 4, 5, 6}

객체내의 요소를 제거하기 위한 메소드로 .remove().discard()를 사용할 수 있습니다. .remove()의 경우 지정한 요소가 없을 경우는 에러를 발생하지만 .discard()의 경우는 에러를 발생하지 않는 차이를 보입니다.

set1.remove("python")
~~KeyError: 'python'
set1.discard('python'); set1
{(1, 2, 3), 3, 4, 5, 6}
set1.pop()
3
set1.pop()
4
set1
{(1, 2, 3), 5, 6}
set1.clear(); set1
set()

복사

리스트 객체의 복사에서 소개한 방식과 동일하게 이루어 집니다. 즉, .copy() 메소드를 사용하여 복사할 수 있으며 리터럴이나 객체 자체의 복사는 깊은 복사, 내재된 컬렉션의 요소(들)은 얕은 복사를 실행합니다.

할당연산자를 사용한 복사는 얕은 복사입니다.

a={1, 2, 3, 4, 5}
b=a
b is a
True
b == a
True
a.add(10)
a
{1, 2, 3, 4, 5, 10}
b
{1, 2, 3, 4, 5, 10}

객체 a의 요소들은 모두 수치 리터럴입니다. 그러므로 .copy()에 의한 복사는 깊은 복사가 이루어 집니다.

c=a.copy()
c==a
True
c is a
False

집합(set) 연산

set 자료형은 합집합(union), 교집합(intersection), 차집합(difference), 그리고 여집합(symmetric difference)과 같은 연산을 위한 메소드들을 가지고 있습니다.

표 2 집합형의 합집합 메소드
메서드 내용
a.union(b)두 집합 a, b의 합집합을 반환
이 연산은 'or' 연산자인 '|'에 의해 수행
새로운 객체 생성
a.update(b) a는 a|b의 결과로 치환 즉, a는 두 객체의 합으로 수정됨
A = {1, 2, 3, 4, 5} 
B = {4, 5, 6, 7, 8} 
A.union(B) 
{1, 2, 3, 4, 5, 6, 7, 8}
A|B
{1, 2, 3, 4, 5, 6, 7, 8}
A
{1, 2, 3, 4, 5}
A.update(B); A
{1, 2, 3, 4, 5, 6, 7, 8}
표 3 집합형의 교집합 메소드
메서드 내용
a.intersection(b) a, b의 교집합 연산을 수행
'&' 연산자에 의해 같은 결과를 반환
새로운 객체 생성
a.intersection_update(b) a는 a&b의 결과, 즉 교집합으로 치환
A = {1, 2, 3, 4, 5} 
B = {4, 5, 6, 7, 8} 
A.intersection(B) 
{4, 5}
A&B
{4, 5}
A
{1, 2, 3, 4, 5}
A.intersection_update(B); A
{4, 5}
표 4 집합형 차집합 메소드
메서드 내용
a.difference(b) a에만 존재하는 원소들을 반환(차집합)
연산자 ""와 같음
새로운 객체 생성
a.difference_update(b) a는 a − b의 결과로 치환됩니다.
A = {1, 2, 3, 4, 5} 
B = {4, 5, 6, 7, 8} 
A.difference(B) 
{1, 2, 3}
A-B
{1, 2, 3}
A.difference_update(B); A
{1, 2, 3}
표 5 집합형 여집합 메소드
메서드 내용
a.symmetric_difference(b) a와 b의 여집합
연산자 ^와 같음.
새로운 객체 생성
a.symmetric_difference_update(b) a는 a와 b의 여집합으로 치환됩니다.
A = {1, 2, 3, 4, 5} 
B = {4, 5, 6, 7, 8} 
A.symmetric_difference(B) 
{1, 2, 3, 6, 7, 8}
(A|B)-(A&B)
{1, 2, 3, 6, 7, 8}
A.symmetric_difference_update(B); A
{1, 2, 3, 6, 7, 8}
표 6 집합형 논리 연산 메소드
메서드 내용
a.isdisjoint(b) a와 b의 교집합이 null이면 True
즉, 두 집합이 독립이면 True
a.issubset(b) a ⊂ b 이면 True
a.issuperset(b) a ⊃ b 이면 True
A = {1, 2, 3, 4, 5}
B = {1, 2, 3}
C = {7,9}
A.isdisjoint(B)
False
B.isdisjoint(C)
True
B.issubset(A)
True
A.issuperset(B)
True

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b