반응형
[ Numpy ] 대각 행렬 채우기 (np.fill_diagonal)
[ Python 3 ] Numpy 란 무엇인가? (ndarray 클래스)
목차
- np.fill_diagonal
- wrap 적용!
- 3차원 이상에서는 어떻게?
이전글 : 대각 행렬 관련 함수! (np.eye, np.identity, np.diag)
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
반응형