for key, val in params.items():
self.v[key] = np.zeros_like(val)
이 게시글은 이 코드를 이해하기 위해서 작성되었다.
1. 반복문과 딕셔너리의 이해
먼저 NumPy를 사용하지 않은 코드를 먼저 살펴보자.
dic1 = {'a':0, 'b': 1, 'c':2}
dic2 = {}
for key, val in dic1.items():
dic2[key] = val+1
심플하게 생각해보면, dic1의 value에 1을 더해 dic2에 저장한다는 느낌이다. 실제로 dic2를 찍어보면
{'a': 1, 'b': 2, 'c': 3} 과 같은 결과를 얻을 수 있다.
그렇다면 대체 items() 메소드는 무슨 역할을 하는걸까.
책 '점프 투 파이썬' 에 따르면
items 함수는 Key와 Value의 쌍을 튜플로 묶은 값을 dict_items 객체로 돌려준다. dict_values 객체와 dict_items 객체 역시 dict_keys 객체와 마찬가지로 리스트를 사용하는 것과 동일하게 사용할 수 있다.
라고 한다.
실행 후에 key와 val을 찍어보면
key
Out[30]: 'c'
val
Out[31]: 2
다음과 같은 결과를 얻을 수 있다. 이 두 값은 dic1 딕셔너리 변수의 마지막 key와 value 값이다.
과연 Python은 어떻게 이 반복문을 작동시키는 것일까?
디버그를 통해서 확인해보면 key와 val에는 순서대로 (a, b, c) (1, 2, 3) 이 저장된 것을 확인할 수 있다.
즉 Python의 반복문에서는 변수를 2개 이상 받을 수 있으며, 이를 차례대로 넘겨줌을 알 수 있다.
2. np.zeros_like
arr1 = np.array([[1,2],[3,4]])
먼저 다음과 같은 2차원 NumPy 행렬을 만들었다.
arr2 = np.zeros_like(arr1)
arr2
Out[53]:
array([[0, 0],
[0, 0]])
다음과 같이 np.zeros_like() 를 실행하였다. 그 결과 모양과 차원이 동일하지만, 내부 값이 0인 행렬이 나오는 것을 확인할 수 있다.
마지막으로 원본 코드를 다시 살펴보자
for key, val in params.items():
self.v[key] = np.zeros_like(val)
즉 params라는 dict변수에는 특정한 NumPy행렬이 저장되어 있을 것이며, 형태는 유지시키고 값은 0으로 하여 v라는 dict변수에 key값을 그대로 하여 복사한 것이다.
'머신 러닝 및 파이썬 > Numpy 공부' 카테고리의 다른 글
| 행렬 곱셈, 내적 (0) | 2020.03.04 |
|---|---|
| Numpy의 Shape (0) | 2020.03.04 |
| Numpy의 log (0) | 2020.02.27 |
| Numpy의 Dimension (0) | 2020.02.27 |