전체적으로 ndarray 반복시키기

넘파이 마스터 클래스 강좌의 맛보기 강의입니다.

강의 대본

안녕하세요 신경신입니다 우리가 이번 시간에는 저번 시간에 다뤘던 np.repeat이랑 조금 다른 np.tile에 대해서 한번 살펴보도록 하겠습니다 그래서 얘 같은 경우에는 동작 원리가 둘 다 ndarray를 반복을 시키는 건 똑같은데 동작 원리가 좀 다르기 때문에 이번 시간에는 한번 살펴보도록 하겠습니다 그리고 저번 시간에 얘를 부사처럼 사용했었는데 얘를 좀 형용사로 바꿔줬다는 거 참고삼아 알아주시면 좋을 것 같고요 그 다음에 이 np.tile 같은 경우는 제가 저번 시간에 말씀드렸던 것처럼 0, 1, 2, 3을 반복을 시켰을 때 np.repeat은 0, 0, 0, 1, 1, 1, 2, 2 이런 식으로 반복을 시켰다면 이 np.tile 같은 경우에는 전체적으로 이렇게 반복을 시킨다는 특징을 가지고 있어요 그래서 일단 뭐 제가 이렇게 적어야 되는 건지 잘 모르겠는데 뭐라고 표현할지 잘 모르겠어가지고 그냥 전체적인 반복이라고 이렇게 설명을 드렸습니다 먼저 벡터인 경우에서부터 살펴보도록 할게요. 그래서 a를 repetitions 해서 3번을 넣어줬다 라고 하면 그 결과는 앞에서 제가 말씀드린대로 0, 1, 2, 3 얘들이 3번 반복이 돼서 12개의 값을 가지는 걸 볼 수가 있습니다. 참고로 얘의 shape 자체는 이 12개가 나온 게 4개를 3번을 반복을 하기 때문에 이 2개를 곱해주면 되는 거겠죠. 그래서 앞에서 배웠었던 np.repeat이랑 분명하게 다르게 동작을 하죠 근데 어느 것이든 이런 API가 없다면 되게 불편하기 때문에 이 차이점만 잘 알아두고 넘어가시면 좋을 것 같습니다 저 같은 경우에 이 타일이라는 게 우리 화장실 타일이라는 게 얘가 한 칸이 전체적으로 계속 복사가 되는 거잖아요 그러다 보니까 이 타일이라는 걸 개념을 이용해 가지고 조금 암기를 했었는데 여러분들은 마음껏 비유를 하시면 좋을 것 같습니다 그 다음에 우리가 벡터에 대해서도 마찬가지로 이런 식으로 적어줄 수 있게 되는 건데 그럼 여러분들 이렇게 오해를 할 수가 있을 거예요. np.repeat에서는 얘 한 번, 얘 두 번 반복시키려는 거였는데 근데 그게 아니에요. 이 타일 같은 경우에는 축을 기준으로 움직이게 되는 거예요. 왜냐하면 우리가 앞에서 배웠던 것처럼 예를 들어서 0, 1, 2, 3, 3, 4, 5 이런 걸 했었을 때 얘는 어쨌든 전체적으로 반복을 시키기 때문에 이 각 원소별로 반복을 시킨다는 거에 의미가 없어지잖아요. 다시 말해서 원소별로 반복을 시킬 땐 얘 세 번, 얘 네 번인 건데 전체적으로 얘는 타일 같은 경우는 반복을 시키는 거기 때문에 각 원소별로 반복을 시키는 횟수를 적어주는 게 아니라 차원별로 반복을 시키는 걸 적어주는 거예요. 그 결과를 보면 확실하게 아실 수 있을 건데 예를 들어서 제가 지금 3짜리를 넣어줬어요. 이런 식으로 넣어줬죠. 그다음에 첫 번째 차원 0차원으로는 한 번 그 다음에 두 번째 axis는 1 기준으로는 두 번을 반복해주세요 라고 제가 부탁을 했어요 그러니까 얘가 이렇게 들어준 거죠 그래서 얘는 1,6자리 다시 말해서 얘는 한 번이 반복이 됐고 얘는 두 번이 반복이 돼서 6이 된 거를 볼 수가 있을 겁니다 그러면은 반대로 2,1을 한번 넣어 보도록 할게요 그러면은 얘는 이런 결과가 나오게 되는 건데 이 첫 번째 축으로는 두 번을 이런 식으로 두 번 반복을 한 거죠 근데 지금 벡터니까 전체적으로 반복이 되는 건 잘 보이지 않는 걸 알 수가 있겠죠 그래서 우리가 두 번 이렇게 반복이 되고 컬럼별로는 우리가 한 번 반복을 하라고 했으니까 얘가 그대로 들어있는 걸 볼 수가 있겠죠 그럼 마지막으로 우리가 2,2를 써주게 되면은 조금 더 그 결과를 예상할 수가 있겠죠 우리가 2,2 써주면 row로 두 번 그 다음에 컬럼으로 두 번 이런 식으로 반복이 되는 걸 볼 수가 있겠죠 여러분들이 앞에서 다뤘던 거랑 반드시 좀 차이점을 이해하셔야 되는 게 뭐냐면은 np.repeat 같은 경우에는 원소별로 연산이 반복이 되는 거기 때문에 0, 1, 2 그러면은 얘, 얘, 얘 각각 몇 번씩 반복이 돼야 되는지 정해줄 수 있는 거에 반면에 타일 같은 경우에는 전체적으로 우리가 반복을 시키는 거기 때문에 원소별 이런 식으로 반복을 횟수를 정해주는 것보다 axis별로 몇 번씩 반복을 시켜 줘야 되는지 그거를 설정해 준다 정리를 하고 넘어 가시면 좋을 것 같습니다 그러면은 가장 np.tile이 가장 많이 사용이 되는 행렬에 대해서 살펴보도록 할게요 그러면은 얘는 이런식으로 이렇게 두 개의 차원을 가지고 있게 되는 건데 먼저 1,2를 한번 해보도록 할게요 그럼 얘는 첫 번째 차원은 즉 row 별로는 한 번 반복을 하고 즉 반복을 하지 말라는 소리죠 그리고 column으로는 두 번 반복을 해주세요 라고 했으니까 얘는 이런 결과가 나오는 걸 볼 수가 있을 거예요 그래서 이렇게 보면은 얘가 row 별로는 한 번 이렇게 반복이 되고 column 별로는 두 번 이렇게 반복이 된 거를 볼 수가 있을 겁니다 그러니까 다시 한 번 얘는 axis를 기준으로 반복이 된다 이거를 어렵지 않게 이해를 하실 수 있을 겁니다 그리고 나서 2,1짜리를 이런식으로 만들게 되면은 얘는 이런식으로 row wise로 두 번을 반복을 시키는 거 그 다음에 마지막 2,2 이런식으로 넣어주게 되면은 얘는 이렇게 볼 수가 있겠죠 다시 말해서 전체적으로 0,1,2,3,4,5 오른쪽으로도 0,1,2,3,4,5 이런식으로 axis는 0을 기준으로도 1을 기준으로도 두 번씩 반복을 하는 걸 볼 수가 있을 겁니다 그래서 다음 예시를 한번 똑같이 살펴보도록 할게요 얘 같은 경우에는 우리 결과의 shape을 간단하게 한번 연산을 해보는 건데 살짝 머리를 한번 굴려보도록 할게요 이 안에는 reps 안에는 리스트를 넣어줘도 괜찮지만 이런 식으로 어레이를 넣어줘도 괜찮아요 근데 제가 이걸 뭐를 하려고 하는 거냐면 먼저 이 타일의 결과를 한번 뽑아본 게 바로 6,15죠 근데 얘 같은 경우에는 reps 이 안에 들어가는 거랑 A의 shape을 곱하게 되는 건데 얘가 지금 2,3 짜리였고 얘가 지금 3번, 5번 그러니까 첫 번째 차원으로는 두 번 반복을 해주세요 이러니까 6이 될 거고 얘는 이렇게 돼서 15가 되는 거 다시 말해서 우리가 이 타일이라는 것 자체가 여기다가 ndarray를 넣어주면 그 결과까지도 우리가 계산을 해 볼 수가 있겠죠 그렇게 중요한 건 아니지만 여러분들이 NumPy를 이용해서 정보를 추출하는 방법 이런 것들 같이 연습을 시켜 드리려고 같이 적는 거라고 생각하시면 좋을 것 같습니다 그래서 얘도 마찬가지로 얘가 2,3 짜리 잖아요 근데 얘는 18 이렇게 되니까 10 돼서 20이 이렇게 만들어지게 되는 거고 8은 3이랑 곱해줘서 이렇게 24가 되는 거를 마찬가지로 확인할 수가 있겠죠 그러면 얘를 가지고 이번에 로우 벡터를 확장시켜 보도록 할게요 얘 같은 경우에는 로우 벡터, 즉 0, 1, 2, 2, 3 이렇게 로우 벡터로 만든 거죠 그랬을 때 얘를 이렇게 만들어줘야 되는 거죠 즉 컬럼으로는 반복을 하지 말고 로우로 5번 이렇게 반복을 하게 되면 이런 결과가 나오게 되는 거고 마찬가지로 이번에는 컬럼 벡터를 반복을 시키게 되면 얘는 두 번째 축을 기준으로 5번 반복을 해주세요 라고 하게 되면 얘가 오른쪽으로 5번 반복이 되는 걸 볼 수가 있겠죠 이런 것처럼 여러분들이 이번 시간에 되게 간단하죠 그냥 차이점만 비교를 하시면 되는 거예요 그래서 앞에서 배웠었던 np.repeat과 np.tile은 분명히 서로 ndarray를 반복을 시키긴 하지만 그 동작 원리가 달라요 그러다 보니까 여러분들이 전체적으로 반복을 시킬 때는 그렇게 np.repeat을 가지고 고생을 하지 마시고 이 tile을 잘 이용하시면 되게 편하게 프로그램을 하실 수 있을 겁니다 그 다음에 이제 다음 시간에 우리가 배워볼 거는 얘를 이용해서 실제 딥러닝에서 사용하게 될 연산을 한번 구해내보도록 하겠습니다 이번 시간 짧지만 이 np.tile을 어떻게 사용하는지 잘 정리를 하고 넘어가셨으면 좋겠습니다 수고하셨습니다

이 강좌의 강의

  • 넘파이 소개
  • 파이썬에서의 객체
  • 스페셜 메소드
  • ndarray 객체
  • 텐서와 ndarray
  • 파이썬 리스트로 ndarray 만들기
  • 정해진 shape으로 ndarray 만들기
  • 정해진 간격과 개수로 ndarray 만들기
  • 랜덤한 값으로 ndarray 만들기
  • ndarray의 ndim, shape, size
  • ndarray의 dtype, itemsize, nbytes
  • ndarray의 모양 바꾸기(np.reshape)
  • np.reshape에서의 -1
  • ndarray의 원소 개수 바꾸기(np.resize)
  • ndarray의 flattening
  • 넘파이의 메모리 최적화
  • ndarray의 dtype 바꾸기
  • ndarray의 원소별 연산
  • 브로드캐스팅 소개
  • ndim이 1일 때의 브로드캐스팅
  • ndim이 2일 때의 브로드캐스팅
  • ndim이 다를 때의 브로드캐스팅
  • 벡터 ndarray의 인덱싱과 슬라이싱
  • 행렬 ndarray의 인덱싱과 슬라이싱
  • 텐서 ndarray의 인덱싱과 슬라이싱
  • int ndarray로 인덱싱하기
  • bool ndarray로 인덱싱하기
  • 행렬 ndarray에서의 axis, keepdims
  • 텐서 ndarray에서의 axis, keepdims
  • ndarray의 합곱차 구하기
  • ndarray의 통계값 구하기
  • ndarray의 최댓값, 최솟값 구하기
  • Rounding 함수
  • 정렬 함수
  • 삼각함수와 쌍곡선 함수
  • 멱함수
  • 로그함수
  • 벡터의 내적과 행렬의 곱셈
  • reshape으로 새로운 차원 만들기
  • 슬라이싱으로 새로운 차원 만들기와 expand_dims
  • ndarray의 쓸모없는 차원 없애기
  • ndarray의 차원 바꾸기
  • np.hstack과 np.vstack
  • np.concatenate과 np.dstack, np.stack
  • 원소별로 ndarray 반복시키기
  • 전체적으로 ndarray 반복시키기재생 중
  • ndarray 반복의 응용
  • 좌표축 만들기(np.meshgrid)
  • 스칼라의 Fully-connected Operation
  • 벡터의 Fully-connected Operations
넘파이 마스터 클래스
넘파이 마스터 클래스강좌 자세히 보기