2 . 3 . 데이터 조작 ( data manipulation ) — Dive into Deep Learning documentation 
 2 . 딥 러닝 맛보 기 navigate _ next 2 . 3 . 데이터 조작 ( data manipulation ) 
 2 . 3 . 데이터 조작 ( data manipulation ) ¶ 
 데이터 를 변경 할 수 없 다면 아무것 도 할 수 없 습니다 . 일반 적 으로 우리 는 데이터 를 사용 해서 두 가지 중요 한 일 을 합니다 . ( i ) 데이터 를 얻 고 , ( ii ) 컴퓨터 에서 들어오 면 처리 하 기 . 데이터 를 저장 하 는 방법 을 모른다면 데이터 를 얻 는 것 의 의미 가 없 으니 , 합성 된 데이터 를 다루 는 것 부터 시작 하 겠 습니다 . 
 MXNet 에서 데이터 를 저장 하 고 변경 하 는 주요 도구 인 NDArray 를 소개 하 겠 습니다 . NumPy 를 사용 해 봤 다면 , NDArray 가 NumPy 의 다 차원 배열 과 디자인 측면 에서 비슷 하 다는 것 을 눈치 챌 것 입니다 . 하지만 , 주요 장점 들 이 있 습니다 . 첫 번 째 로 는 NDArray 는 CPU , GPU 그리고 분산 클라우드 아키텍처 에서 비동기 연산 을 지원 합니다 . 두 번 째 는 , 자동 미분 을 지원 합니다 . 이 특징 들 때문 에 NDArray 는 머신 러닝 에 이상 적 인 요소 라고 할 수 있 습니다 . 
 2 . 3 . 1 . 시작 하 기 ¶ 
 이 절 에서 는 여러분 은 기본 적 인 것 을 다룰 것 입니다 . 요소 별 연산 이나 표준 분포 와 같 은 기본 적 인 수학 내용 을 이해 하 지 못해도 걱정 하 지 마세요 . 다음 두 절 에서 필요 한 수학 과 어떻게 코드 로 구현 하 는지 를 다룰 예정 입니다 . 수학 에 대해서 더 알 고 싶 다면 , 부록 에 “ Math ” 를 참고 하 세요 . 
 MXNet 과 MXNet 의 ndarray 모듈 을 import 합니다 . 여기 서 는 ndarray 를 nd 라고 별칭 을 주 겠 습니다 . 
 우리 가 만들 수 있 는 가장 단순 한 객체 는 벡터 입니다 . arange 는 12 개 의 연속 된 정수 를 갖 는 행 벡터 를 생성 합니다 . 
 x 를 출력 할 때 나온 < NDArray 12 @ cpu ( 0 ) > 로 부터 , 우리 는 이것 이 길이 가 12 인 일차원 배열 이 고 , CPU 의 메인 메모리 에 저장 되 어 있 다는 것 을 알 수 있 습니다 . @ cpu ( 0 ) 에서 0 은 아무런 의미 가 없 고 , 특정 코어 를 의미 하 지 도 않 습니다 . 
 NDArray 인 스턴스 의 shape 은 shape 속성 으로 얻 습니다 . 
 size 속성 은 NDArray 인 스턴스 의 원소 총 개수 를 알려 줍니다 . 우리 는 벡터 를 다루 고 있 기 때문 에 두 결과 는 같 습니다 . 
 행 벡터 를 3 행 , 4 열 의 행렬 로 바꾸 기 위해서 , 즉 shape 을 바꾸 기 위해서 reshape 함수 를 사용 합니다 . 모양 ( shape ) 이 바뀌 는 것 을 제외 하 고 는 x 의 원소 와 크기 는 변하 지 않 습니다 . 
 위 와 같이 행렬 의 모양 을 바꾸 는 것 은 좀 이상 할 수 있 습니다 . 결국 , 3 개 행 을 갖 는 행렬 을 원한다면 총 원소 의 개수 가 12 개 가 되 기 위해서 열 이 4 가 되 어야 한다는 것 을 알 아야 합니다 . 또는 , NDArray 에게 행의 개수 가 몇 개 이 든지 모든 원소 를 포함 하 는 열 이 4 개 인 행렬 을 자동 으로 찾아내 도록 요청 하 는 것 도 가능 합니다 . 즉 , 위 의 경우 에 는 x . reshape ( ( 3 , 4 ) ) 는 x . reshape ( ( - 1 , 4 ) ) 와 x . reshape ( ( 3 , - 1 ) ) 와 같 습니다 . 
 [ [ 1 . 805371 e + 13 4 . 574118 e - 41 1 . 805371 e + 13 4 . 574118 e - 41 ] 
 [ 0 . 000000 e + 00 0 . 000000 e + 00 0 . 000000 e + 00 0 . 000000 e + 00 ] 
 [ 0 . 000000 e + 00 0 . 000000 e + 00 0 . 000000 e + 00 0 . 000000 e + 00 ] ] 
 empty 메소드 는 모양 ( shape ) 에 따른 메모리 를 잡 아서 원소 들 의 값 을 설정 하 지 않 고 행렬 를 반환 합니다 . 이 는 아주 유용 하 지만 , 원소 들 이 어떤 형태 의 값 이 라도 가질 수 있 는 것 을 의미 합니다 . 이 는 매우 큰 값 들 일 수 도 있 습니다 . 하지만 , 일반 적 으로 는 행렬 을 초기 화 하 는 것 을 원합니다 . 
 보통 은 모두 0 으로 초기 화 하 기 를 원합니다 . 수학자 들 은 이 차원 보다 큰 객체 들 에 대해서 는 특별 한 이름 을 쓰 지 않 지만 , 우리 는 이것 들 은 텐서 ( tensor ) 라고 부르 겠 습니다 . 모든 원소 가 0 이 고 모양 ( shape ) 이 ( 2 , 3 , 4 ) 인 텐서 를 하나 만들 기 위해서 다음 과 같이 합니다 . 
 NumPy 처럼 , 모든 원소 가 1 인 텐서 를 만드 는 방법 은 다음 과 같 습니다 . 
 Python 리스트 를 이용 해서 NDArray 의 각 원소 값 을 지정 하 는 것 도 가능 합니다 . 
 어떤 경우 에 는 , NDArray 의 값 을 임의 로 채우 기 를 원할 때 가 있 습니다 . 이 는 특히 뉴 럴 네트워크 의 파라미터 로 배열 을 사용 할 때 일반 적 입니다 . 아래 코드 는 shape 가 ( 3 , 4 ) NDArray 를 생성 하 고 , 각 원소 는 평균 이 0 이 고 분산 이 1 인 표준 분포 로부터 임의로 추출 한 값 을 갖 습니다 . 
 2 . 3 . 2 . 연산 들 ¶ 
 제곱 과 같 은 더 많 은 연산 들 이 요소 별 연산 으로 적용 될 수 있 습니다 . 
 요소 별 연산 과 더불 어서 , dot 함수 를 이용 한 행렬 의 곱 처럼 행렬 의 연산 들 도 수행 할 수 있 습니다 . 행렬 x 와 y 의 전치행렬 에 대해서 행렬 의 곱 을 수 행해 보 겠 습니다 . x 는 행 이 3 , 열 이 4 인 행렬 이 고 , y 는 행 이 4 개 열 이 3 개 를 갖 도록 전치 시킵니다 . 두 행렬 을 곱하 면 행 이 3 , 열 이 3 인 행렬 이 됩니다 . ( 이것 이 어떤 의미 인지 햇 갈려 도 걱정 하 지 마세요 . linear algebra 절 에서 행렬 의 연산 에 대한 것 들 을 설명 할 예정 입니다 . ) 
 여러 NDArray 들 을 합치 는 것 도 가능 합니다 . 이 를 위해서 는 어떤 차원 ( dimension ) 을 따라서 합쳐야 하 는지 를 알려줘야 합니다 . 아래 예제 는 각각 의 차원 0 ( 즉 , 행 들 ) 과 차원 1 ( 열 들 ) 을 따라서 두 행렬 을 합 칩니다 . 
 NDArray 의 모든 요소 를 더 하 면 하나 의 원소 를 갖 는 NDArray 가 됩니다 . 
 asscalar 함수 를 이용 해서 결과 를 Python 의 스칼라 로 바꿀 수 있 습니다 . 아래 예제 는 x 의 \(\ ell _ 2 \) 놈 을 계산 합니다 . 이 결과 는 하나 의 원소 를 갖 는 NDArray 이 고 , 이 를 Python 의 스칼라 값 으로 바 꿉니다 . 
 표기 를 편하 게 하 기 위해서 y . exp ( ) , x . sum ( ) , x . norm ( ) , 등 을 각각 nd . exp ( y ) , nd . sum ( x ) , nd . norm ( x ) 처럼 쓸 수 도 있 습니다 . 
 2 . 3 . 3 . 브로드 케스 트 메카 니즘 ¶ 
 위 절 에서 우리 는 같 은 모양 ( shape ) 의 두 NDArray 객체 에 대한 연산 을 어떻게 수행 하 는지 를 살펴봤 습니다 . 만약 모양 ( shape ) 이 다른 경우 에 는 NumPy 와 같이 브로드 케 스팅 메카 니즘 이 적용 됩니다 : 즉 , 두 NDArray 가 같 은 모양 ( shape ) 을 갖 도록 원소 들 이 복사 된 후 , 요소 별 로 연산 을 수행 하 게 됩니다 . 
 a 와 b 는 각각 ( 3 x 1 ) , ( 1 x 2 ) 행렬 이 기 때문 에 , 두 행렬 을 더 하 기 에 는 모양 ( shape ) 이 일치 하 지 않 습니다 . NDArray 는 이런 상황 을 두 행렬 의 원소 들 을 더 큰 행렬 ( 3 x 2 ) 로 ‘ 브로드 케 스팅 ’ 해서 해결 합니다 . 즉 , 행렬 a 는 컬럼 을 복제 하 고 , 행렬 b 는 열 을 복제 한 후 , 요소 별 덧셈 을 수행 합니다 . 
 2 . 3 . 4 . 인덱싱 과 슬라이 싱 ( slicing ) ¶ 
 다른 Python 배열 처럼 NDArray 의 원소 들 도 인덱스 를 통해서 지정 할 수 있 습니다 . Python 에서 처럼 첫 번 째 원소 의 인덱스 는 0 이 고 , 범위 는 첫 번 째 원소 는 포함 하 고 마지막 은 포함 하 지 않 습니다 . 즉 , 1 : 3 은 두 번 째 와 세 번 째 원소 를 선택 하 는 범위 입니다 . 행렬 에서 행 들 을 선택 하 는 예 는 다음 과 같 습니다 . 
 값 을 읽 는 것 말 고 도 , 행렬 의 원소 값 을 바꾸 는 것 도 가능 합니다 . 
 여러 원소 에 같 은 값 을 할당 하 고 싶 을 경우 에 는 , 그 원소 들 에 대한 인덱스 를 모두 지정 해서 값 을 할당 하 는 것 으로 간단히 할 수 있 습니다 . 예 를 들 어 [ 0 : 2 , : ] 는 첫 번 째 와 두 번 째 행 을 의미 합니다 . 행렬 에 대한 인덱싱 을 이야기 해 왔 지만 , 벡터 나 2 개 보다 많 은 차원 을 갖 는 텐서 에 도 동일 하 게 적용 됩니다 . 
 2 . 3 . 5 . 메모리 절약 하 기 ¶ 
 이 는 두 가지 이유 로 바람직 하 지 않 을 수 있 습니다 . 첫 번 째 로 는 매번 불 필요 한 메모리 를 할당 하 는 것 을 원하 지 않 습니다 . 머신 러닝 에서 는 수백 메 가 바이트 의 파라미터 들 을 매 초 마다 여러 번 업데이트 를 수행 합니다 . 대부분 의 경우 우리 는 이 업데이트 를 같 은 메모리 ( in - place ) 를 사용 해서 수행 하 기 를 원합니다 . 두 번 째 는 여러 변수 들 이 같 은 파라미터 를 가리키 고 있 을 수 있 습니다 . 같 은 메모리 에 업데이트 를 하 지 않 을 경우 , 메모리 누수 가 발생 하 고 , 래퍼 런 스가 유효 하 지 않 은 파라미터 를 만드 는 문제 가 발생 할 수 있 습니다 . 
 id ( z ) : 140197672472192 
 멋져 보이 지만 , x + y 는 결과 값 을 계산 하 고 이 를 y [ : ] 에 복사 하 기 전 에 이 값 을 저장 하 는 임시 버퍼 를 여전히 할당 합니다 . 메모리 를 더 잘 사용 하 기 위해서 , ndarray 연산 ( 이 경우 는 elemwise _ add ) 을 직접 호출 해서 임시 버퍼 의 사용 을 피할 수 있 습니다 . 모든 ndarray 연산자 가 제공 하 는 out 키워드 를 이용 하 면 됩니다 . 
 2 . 3 . 6 . NDArray 와 NumPy 간 상호 변환 ¶ 
 MXNet NDArray 를 NumPy 로 변환 하 는 것 은 간단 합니다 . 변환 된 배열 은 메모리 를 공유 하 지 않 습니다 . 이것 은 사소 하 지만 아주 중요 합니다 . CPU 또는 GPU 하나 를 사용 해서 연산 을 수행 할 때 , NumPy 가 동일 한 메모리 에서 다른 일 을 수행 하 는 것 을 MXNet 이 기다리 는 것 을 원하 지 않 기 때문 입니다 . array 와 asnumpy 함수 를 이용 하 면 변환 을 할 수 있 습니다 . 
 2 . 3 . 7 . 문제 ¶ 
 다른 모양 ( shape ) 의 행렬 들 에 브로드 케 스팅 이 적용 되 는 연산 을 수행 하 는 두 NDArray 를 바꿔 보 세요 . 예 를 들 면 3 차원 텐서 로 바꿔 보 세요 . 예상 한 결과 도 같 나요 ? 
 2 . 3 . 8 . Scan the QR Code to Discuss ¶ 
 2 . 3 . 1 . 시작 하 기 
 2 . 3 . 2 . 연산 들 
 2 . 3 . 3 . 브로드 케스 트 메카 니즘 
 2 . 3 . 4 . 인덱싱 과 슬라이 싱 ( slicing ) 
 2 . 3 . 5 . 메모리 절약 하 기 
 2 . 3 . 6 . NDArray 와 NumPy 간 상호 변환 
 2 . 3 . 7 . 문제 
 2 . 3 . 8 . Scan the QR Code to Discuss