본문 바로가기
데이터분석/Python

[Numpy] ndarray의 인덱싱과 정렬

by Bookohol 2020. 7. 12.

Numpy

1. Numpy 특징

  • 수치해석용 파이썬 패키지
  • 다차원 배열 자료구조 클래스 ndarray(N-dimensional array)클래스를 지원

    : 배열(array)을 사용하면 적은 메모리로 데이터를 빠르게 처리, 단 모든 원소가 같은 자료형이어야 하며 원소의 갯수를 바꿀 수 없음.

  • 벡터와 행렬 사용하는 선형대수 계산에 주로 사용
  • C로 구현된 내부 반복문을 사용하여 파이썬 반복문에 비해 속도가 빠름

    : 배열 객체는 C와 같이 연속적인 메모리 배치를 가지기에 모든 원소가 같은 자료형이어야 함. 이 덕에 원소에 대한 접근과 반복문 실행이 빨라짐

  • 벡터화 연산(vectorized operation)을 이용해 복잡한 선형대수 연산 수행

    : 백터화 연산? 배열의 각 원소에 대한 반복 연산을 하나의 명령어로 처리

 

2. Numpy 데이터 생성

  • ndarray

    : ndarray를 통해 다차원 배열을 생성하고 쉽게 연산을 수행할 수 있음

import numpy as np
# np라는 약어로 numpy 패키지를 불러옴 


# array() 함수를 통해 numpy.ndarray의 형태를 가지는 데이터를 생성함 

array1 = np.array([0,1,2]) 
array2 = np.array([[1,2,3],
                   [2,3,4]])
array3 = np.array([[1,2,3]])

# type()함수를 통해 데이터 형태를 알 수 있음 
print(type(array1)) 
>>> <class 'numpy.ndarray'>

#shape는 ndarray 크기를 tuple 형태로 저장함 
print(array1.shape)
>>> (3,) 
print(array2.shape)
>>> (2,3)
print(array2.shape)
>>> (1,3) 

#ndim은 ndarray 차원 데이터를 저장함
print(array1.ndim)
>>> 1
print(array2.ndim)
>>> 2
print(array3.ndim)
>>> 3
  • 데이터 타입

    : 숫자형 : int형(8, 16, 32bit), unsigned int형(8, 16, 32bit), float형(16, 32, 64, 128bit)

ndarray 내 동일한 데이터 타입만 들어갈 수 있음.

만약 int+float ⇒ float 형, int+문자 ⇒ <U11(유니코드)으로 변환

a = [1,3,'text']
array1 = np.array(a)
print(array1, array2.type)
>>> [1 3 'text'] <U11 

#dtype으로 데이터 타입 확인 
array2 = np.array([1,2,3.5]) 
print(array2.dtype)
>>> float64


#astype()으로 데이터 타입을 변경할 수 있음
array2_int = array2.astype('int32')
print(array2_int.dtype)
>>> int32 
  • 데이터 차원과 크기 변경
array3 = np.arrange(6) 
print(array3)
>>> [0 1 2 3 4 5] 

array_reshape1=array3.reshape(2,3) 
print(array_reshape1) 
>>> [[0 1 2]
     [3 4 5]]

array_reshape2=array3.reshape(3,2)
print(array_reshape2)
>>> [[0 1]
     [2 3]
     [4 5]]


array_reshape3=array3.reshape(-1,1)
print(array_reshape3)
>>> [[0]
     [1]
     [2]
     [3]
     [4]
     [5]]
# -1을 사용하면 주어진 데이터 차원에 맞게 변경. 차원이 맞지 않을 경우 에러 발생함 

 

3. Numpy의 인덱싱

  • 배열 인덱싱(array indexing)을 사용한 Query 기능을 사용해 복잡한 수식 계산
a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
idx = np.array([True, False, True, False, True,
                False, True, False, True, False])
a[idx]
>>> array([0, 2, 4, 6, 8])


b=a[a>5]
print(b)
>>> [False False False False False False True True True True] 

indexes = np.array([1,3,5,7])
c=a[indexes]
print(c)
>>> [1 3 5 7]

 

4. Numpy 정렬

  • np.sort() 와 ndarray.sort()
array1=np.array([5,2,1,6])
print(np.sort(array1))
>>> [1 2 5 6] 
print(array1)
>>> [5 2 1 6]
# np.sort()는 원본 행렬을 바꾸지 않음


print(array1.sort())
>>> [1 2 5 6]
print(array1)
>>> [1 2 5 6]
# ndarray.sort()는 원본 행렬을 변환
  • np.argsort()
a=np.array([2,1,8,4])
print(np.argsort(a))
>>> [1 0 3 2] 
# 정렬된 행렬 a의 index를 저장 (오름차순)

print(np.argsort(a)[::-1]) 
>>> [2 3 0 1]
# 정렬된 행렬 a의 index를 저장 (내림차순) 


# 응용 

name = np.array(['철수', '영희', '민수'])
score = np.array([50, 70, 35]) 

sort_score=np.argsort(score)
print(name[sort_score])
>>> ['민수' '철수' '영희'] 

 

 

 

 

 

 

 

 

'데이터분석 > Python' 카테고리의 다른 글

[Pandas] Basic  (0) 2020.07.12
[Pandas] 데이터 프레임의 이해와 생성  (0) 2020.03.23

댓글