프로그래밍/Python

파이썬 데이터 분석 준비! - Numpy배열 다루기 - 2(배열 데이터 다루기)

Dibrary 2022. 3. 24. 09:50
반응형

안녕하세요 Dibrary입니다.

저번 글에 이어서 이번에는 배열의 데이터를 다뤄보겠습니다. 혹시 Numpy배열을 만드는 방법을 모르신다면 이전 글을 참고해 주세요.

 

파이썬 데이터 분석 준비! - Numpy배열 다루기 - 1(객체 만들어보기)

안녕하세요 Dibrary입니다. 최근 화두가 되는 데이터 분석 및 빅데이터 등등 데이터가 들어가는 것에 파이썬이 안쓰이는 곳이 없습니다. 데이터를 다루려면 Numpy와 Pandas를 다룰 줄 아는 것이 거진

dibrary.tistory.com

 

 

Numpy를 사용하려면 당연히 import부터 해 주셔야 합니다.

 

먼저 데이터의 자료형을 바꿔보겠습니다.

astype 함수를 사용해서 자료형을 입력하면, 구성 데이터가 해당 자료형으로 변경됩니다.

자료형은 Numpy 자료형을 써야 하지만, 그냥 파이썬 자료형을 써도 자동으로 변경 됩니다.
물론, 이렇게 사용하려면 어떤 자료형으로 자동 변환되는지를 미리 알고 있어야 합니다.

int는 np.int32를 입력한 것과 같이 변경됩니다.
float은 np.float64를 입력한 것과 같이 변경됩니다.

 

 

Numpy배열을 만들 때, 처음부터 데이터 자료형을 지정할 수도 있습니다.

 

 


이제부터 데이터를 Numpy 차원에서 다뤄 보겠습니다. 앞서 단순한 상수의 사칙연산은 모든 원소에 자동으로 적용됨을 볼 수 있었습니다.

 

단순히 사칙연산만 가능할까요?

값 간의 크고 작은 관계도 확인 해 볼 수 있습니다.

tmp3 Numpy배열은 모두 0으로 구성되어있으므로, tmp2의 값이 모두 tmp3의 값들보다 크죠? 그래서 모두 True로 구성된 배열이 생성된 것입니다.

 

이제 조금 복잡해지니까 잘 보세요.

배열을 슬라이싱으로 값을 잘라서 일부만 꺼내 보았습니다.

먼저 [1:2][ : ] 는 왜 [5,6,7,8] 이 나왔을까요?

[1:2]는 가로줄에서 1번 인덱스부터 시작해서 2번인덱스를 포함하지 않는 범위. 를 의미합니다.
즉, 가로줄 1번 인덱스 값이 먼저 해당됩니다. [5,6,7,8] 에서 [ : ]은 데이터 전부를 의미합니다. 따라서 [5,6,7,8]이 그대로 출력된 것이죠.

[1: ]은 1번 인덱스부터 시작해서 끝까지 범위. 를 의미합니다.
그러면 1번 인덱스와 2번인덱스 값 전부인데, 그 다음 슬라이싱이 [ : ]으로 되어 있으므로, 데이터 전부 그대로 출력 됩니다.

참고로, 슬라이싱이란 이처럼 인덱스를 이용해서 데이터를 뽑아내는 방법을 의미합니다.

 

마지막 방법이 가장 의아하실 수 있는데요, 하나하나 보겠습니다.

중요한 점은 뽑아낸 데이터에서도 인덱스는 반드시 0부터 시작하는 것임을 까먹으시면 안 됩니다.

 

근데 이렇게 뽑아낸 인덱싱 방법은 list에서 사용하던 방식입니다.  Numpy배열은 더 간단한 방법이 있습니다.

아까 대괄호를 3번이나 쓴 것 보다 더 간단하죠? 대괄호 하나 가지고 필요한 데이터를 뽑아냈습니다.

list 방식으로 뽑아낼 때 [1:][1]이 [2: ]와 같은 역할을 합니다. 

그리고, [2: ]데이터 중에 [2: ] 범주의 데이터만을 뽑아내는데, 이를 하나의 대괄호 안에 몰아서 쓴 것이죠.

 

 

이런 슬라이싱 방법이 처음에는 빠르게 그려지지 않을 겁니다. 어떻게 값을 뽑아야 할지, 어디부터 잘라야 할지... 

이럴 때 해법은? 딱 하납니다.

많이 사용해보는 것 뿐

 

 


list 에서 순회 하면서 데이터를 하나씩 차례대로 넣어보신 경험이 있으실 겁니다. Numpy배열은 한 번에 뭉텡이로 변경을 할 수 있습니다.

tmp1이라는 Numpy배열을 만들고, 그 중에 0번째 인덱스 값인 [[1,2,3],[4,5,6]]을 한 번에 변경해 보았습니다.

굉장히 쉽죠? 하지만, 조금 까다로운 점은, 모양이 같아야 한다는 것입니다.

2 X 3 배열에 2 X 2 배열을 이용해서 값을 변경해보려 했더니 ValueError가 나옵니다.

'모양이 같아야 한다는 것!!' 이 점을 꼭 기억해야 편리한 기능을 활용할 수 있습니다.

 

 

이렇게 직접 지칭하는 Numpy배열 원소를 Numpy배열로 변경할 수 있다면, Numpy배열 원소의 일부만을 변경할 수도 있지 않을까요? 바로 위에 언급해드린 슬라이싱 방법으로 말이죠.

슬라이싱으로 잘라낸 인덱스 위치의 데이터 11, 12를 777로 변경 해 보았습니다. 아주 쉽죠?

 

이번엔 여기까지~

728x90
반응형