본문 바로가기
컴퓨터 언어/Python_NumPy

[ Numpy ] 대각 행렬 채우기 (np.fill_diagonal)

by SuperMemi 2022. 4. 11.
반응형

[ Numpy ] 대각 행렬 채우기 (np.fill_diagonal)

 

 


[ Python 3 ] Numpy 란 무엇인가? (ndarray 클래스)

 

[ Python 3 ] Numpy 란 무엇인가? (ndarray 클래스)

NumPy 소개 Numpy(보통 "넘파이"라고 발음)는 수치 해석용 Python 패키지이다. 다차원의 행렬 자료구조인 ndarray를 지원하여 벡터와 행렬을 사용하는 선형대수 계산에 주로 사용된다. C로 구현된 CPython

supermemi.tistory.com


목차

  • np.fill_diagonal
  • wrap 적용!
  • 3차원 이상에서는 어떻게?

이전글 : 대각 행렬 관련 함수! (np.eye, np.identity, np.diag)

 

[ Numpy ] 대각 행렬 관련 함수! (np.eye, np.identity, np.diag)

[ Numpy ] 대각 행렬 관련 함수! (np.eye, np.identity, np.diag) Numpy 에 존재하는 대각 행렬 관련 함수에 대해 알아보자! 목차 np.eye np.identity np.diag np.eye(N, M=None, k=0, dtype= , ord..

supermemi.tistory.com


np.fill_diagonal(a, val, wrap=False)

 

말 그대로 대각선 요소들의 값을 원하는 값으로 채워 주는 함수이다.

  • a : input array, 적어도 2차원 이상
  • val : 채우고자 하는 값 (scalar or array_like) : 어레이로 넣을 경우 순서대로 입력됨
  • wrap : 정사각 행렬이 아닌 경우 확장시킬 건가? (bool, default=False)
>>> import numpy as np

>>> a = np.zeros((3,3))
>>> a
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])
       
>>> np.fill_diagonal(a, 5)
>>> a
array([[5., 0., 0.],
       [0., 5., 0.],
       [0., 0., 5.]])
       
>>> np.fill_diagonal(a, [1,2,3])
>>> a
array([[1., 0., 0.],
       [0., 2., 0.],
       [0., 0., 3.]])

#주어진 행렬크기보다 채울 값이 작은 경우 반복적으로 적용
>>> np.fill_diagonal(a, [1,2]) 
>>> a
array([[1., 0., 0.],
       [0., 2., 0.],
       [0., 0., 1.]])
       
>>> b = np.zeros((5,5))
>>> b
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
>>> np.fill_diagonal(b, [1,2])
>>> b
array([[1., 0., 0., 0., 0.],
       [0., 2., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 2., 0.],
       [0., 0., 0., 0., 1.]])
       
>>> np.fill_diagonal(b, [[1,2],[3,4]])
>>> b
array([[1., 0., 0., 0., 0.],
       [0., 2., 0., 0., 0.],
       [0., 0., 3., 0., 0.],
       [0., 0., 0., 4., 0.],
       [0., 0., 0., 0., 1.]])

Wrap을 적용해보자 np.fill_diagonal(a, val, wrap=True) 

 

>>> c = np.zeros((3,5))
>>> np.fill_diagonal(c, [1,2,3], wrap=False)
>>> c
array([[1., 0., 0., 0., 0.],
       [0., 2., 0., 0., 0.],
       [0., 0., 3., 0., 0.]])
>>> 
>>> np.fill_diagonal(c, [1,2,3], wrap=True)
>>> c
array([[1., 0., 0., 0., 0.],
       [0., 2., 0., 0., 0.],
       [0., 0., 3., 0., 0.]])

>>> d = np.zeros((5,3))
>>> np.fill_diagonal(d, [1,2,3], wrap=False)
>>> d
array([[1., 0., 0.],
       [0., 2., 0.],
       [0., 0., 3.],
       [0., 0., 0.],
       [0., 0., 0.]])
>>> np.fill_diagonal(d, [1,2,3], wrap=True)
>>> d
array([[1., 0., 0.],
       [0., 2., 0.],
       [0., 0., 3.],
       [0., 0., 0.],
       [1., 0., 0.]])

3차원 이상에서는?

3차원 

정확히 각 차원의 (0,0,0),(1,1,1),(2,2,2) 에 순서대로 값이 하나씩 들어감.

>>> e = np.zeros((3,3,3))
>>> e
array([[[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],

       [[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],

       [[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]]])
>>> np.fill_diagonal(e,[1,2,3])
>>> e
array([[[1., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],

       [[0., 0., 0.],
        [0., 2., 0.],
        [0., 0., 0.]],

       [[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 3.]]])
        
>>> e[0]
array([[1., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])
>>> e[1]
array([[0., 0., 0.],
       [0., 2., 0.],
       [0., 0., 0.]])
>>> e[2]
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 3.]])
       
>>> e[0][0][0]
1.0
>>> e[1][1][1]
2.0
>>> e[2][2][2]
3.0

4차원

정확히 각 차원의 (0,0,0,0),(1,1,1,1),(2,2,2,2) 에 순서대로 값이 하나씩 들어감.

>>> f = np.zeros((3,3,3,3))
>>> np.fill_diagonal(f,[1,2,3])
>>> f
array([[[[1., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]],

        [[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]],

        [[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]]],


       [[[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]],

        [[0., 0., 0.],
         [0., 2., 0.],
         [0., 0., 0.]],

        [[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]]],


       [[[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]],

        [[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 0.]],

        [[0., 0., 0.],
         [0., 0., 0.],
         [0., 0., 3.]]]])

>>> f[0][0]
array([[1., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])
>>> f[1][1]
array([[0., 0., 0.],
       [0., 2., 0.],
       [0., 0., 0.]])
>>> f[2][2]
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 3.]])
       
>>> f[0][0][0][0]
1.0
>>> f[1][1][1][1]
2.0
>>> f[2][2][2][2]
3.0​

 

 

 

 

 

 

반응형