2015년 4월 29일 수요일

sympy 선형대수 1 : 행렬의 생성

 심파이(sympy)의 행렬 객체는  Matrix이다. 이 Matrix 객체를 생성할 때는 리스트를 넘겨주면 된다. 넘겨준 리스트의 각 요소는 행렬의 행이 된다. 기본적인 사용 예는 다음과 같다.

>>> Matrix([[1,0],[0,1]]) #[1,0]이 1행, [0,1]이 2행이 된다.
>>> Matrix([[11, 22, 33]]) # 리스트의 첫 번째 요소인 [11,22,33]이 1행이 된다.
>>> Matrix([11, 22, 33]) # 11이 1행, 22가 2행, 33이 3행이 된다.

다른 방법으로 행의 개수와 열의 개수를 명시적으로 지정해 주는 방법이 있다.

>>> A = Matrix(2, 3, [1,2,3,4,5,6])
⎡1  2  3⎤
⎣4  5  6⎦

>>> B = Matrix(4, 4, range(16))
⎡0   1   2   3 ⎤
⎢4   5   6   7 ⎥
⎢8   9   10  11⎥
⎣12  13  14  15⎦

행 요소와 열 요소의 관계를 파이썬 함수로 작성하여 이것을 사용할 수도 있다.

>>> def f(i,j):
 if i==j : return 1
 else : return 0

>>> Matrix(4,4,f)
⎡1  0  0  0⎤
⎢0  1  0  0⎥
⎢0  0  1  0⎥
⎣0  0  0  1⎦

명시적 함수뿐만 아니라 익명 함수도 사용할 수도 있다.

>>> Matrix(3, 4, lambda i,j:1-(i+j)%2)
⎡1  0  1  0⎤
⎢0  1  0  1⎥
⎣1  0  1  0⎦

특수한 행렬을 생성하는 함수도 있다. eye() 함수는 항등 행렬을 생성하며, zeros() 는 영행렬을 그리고 ones()는 일행렬을 만들어 준다.

>>> eye(4)
>>> zeros(2)
>>> ones(3)
>>> ones(1,3)

대각행렬을 생성하는 diag() 함수도 있다. 스칼라나 행렬을 인수로 주면 그것들로 대각행렬을 생성한다.

>>> diag(1,2,3)
>>> diag(-1, ones(2,2), Matrix([5,7,6]))

스칼라는 1x1 행렬로 간주되며 주어진 행렬들을 대각 위치에 놓는다.

 난수 행렬을 발생시킬 수도 있으며 randMatrix() 함수를 이용한다.

>>> randMatrix(4) # 4x4 행렬 생성
>>> randMatrix(3,4) # 3x4 행렬 생성
>>> randMatrix(5, symmetric = True) # 5x5의 대칭행렬 생성

이 행렬의 요소는 100이하의 양의 정수로 채워진다.

[표 1] 행렬 객체의 생성 용례들
용법
내용
Martix(list)
Matrix([list1, list2,...])
Matrix(r, c, seq)
Matrix(r, c, func)
열벡터 생성
행렬 생성
seq를 이용하여 r x c 행렬 생성
함수를 이용하여 r x c 행렬 생성
eye(n)
n x n 단위행렬
zeros(n)
zeros(r, c)
n x n 영행렬
r x c 영행렬
ones(n)
ones(r, c)
n x n 일행렬
r x c 일행렬
diag(arg1, arg2, ...)
args 요소들의 단위행렬 생성
randMatrix(n)
randMatrix(r, c)
n x n 난수행렬 (대칭행렬은 symmetric=True 옵션을 지정)
r x c 난수행렬

 한 가지 주지할 사항은 Matrix 객체는 mutable 하다는 것이다. 따라서 immutability 가 필요한 곳(예를 들어 딕셔너리의 키)에는 사용할 수 없다. immutable행렬이 필요하다면 ImmutableMatrix 를 이용하면 된다.

댓글 없음:

댓글 쓰기