'numpy'에 해당되는 글 4건
판다스(pandas) 인덱스
인덱스(Index) 는 DataFrame, Series의 레코드를 고유하게 식별하는 객체이다.
# Index 객체 추출
indexes = titanic_df.index
- .index : RangeIndex(start=0, stop=891, step=1)으로 결과가 나오며 인덱스의 처음과 끝값을 range형태로 알려준다.
식별성 데이터를 1차원 array로 가지고 있으며, 단일값 반환 및 슬라이싱도 가능하다.
하지만, indexes[6] = 0 과 같이 한번 만들어진 DataFrame, Series, Index 객체는 함부로 변경할 수 없다.
series_fair = titanic_df['Fare']
print(series_fair.max())
print(series_fair.min())
print(sum(series_fair))
- 'Fare' 컬럼을 Series 형태로 뽑아서 저장하고 숫자로 된 데이터들은 max(), min(), sum() 등과 같은 연산 함수를 적용할 수 있다.
titanic_reset_df = titanic_df.reset_index(inplace=False)
print(titanic_reset_df)
- .reset_index() : 인덱스를 새로 만들어주는 함수로 0부터 시작하게 된다. 기존의 인덱스는 새로운 index라는 칼럼으로 titanic_df의 데이터 프레임에 추가된다. 또한 inplace = False를 통해 기존 데이터 프레임에 영향을 주지 않는다.
- 주로 인덱스가 연속된 int 숫자형 데이터가 아닐 경우에 사용한다.
- DataFrame 에서 [] 연산자
넘파이에서는 행의 위치, 열의 위치, 슬라이싱 범위 등 지정해 데이터를 가져올 수 있음
하지만 DataFrame 바로 뒤에 있는 [ ]의 안에 들어갈 수 있는 값은 컬럼명 문자, 또는 인덱스로 변환 가능한 표현식 = 칼럼을 지정할 수 있는 연산자
print(titanic_df['Pclass'].head(2))
print(titanic_df[0])
- 첫번째 프린트는 컬럼명 문자로 접근하여 출력이 가능하나, 두번째 프린트문에서는 숫자로 접근했고 해당 칼럼이 존재하지 않기 때문에 오류가 발생하게 된다.
- 하지만 판다스의인덱스 형태로 변환 가능한 표현식은 숫자도 가능 (예. titanic_df[0:2]) 하지만 비추천합니다.
titanic_df[titanic_df['Pclass'] == 3].head(3)
- 위와 같은 불린 인덱싱 표현도 가능하다. 'Pclass'가 3인 행만 추출하여 보여줄 수 있다.
명칭 기반 인덱싱과 위치 기반 인덱싱의 구분
- 명칭(label) 기반 인덱싱 : 칼럼의 명칭을 기반으로 위치를 지정하는 방식. '칼럼 명' 같이 명칭으로 열 위치를 지정하는 것
- 위치(position) 기반 인덱스 : 0을 출발점으로 하는 가로축, 세로축 좌표를 기반으로 행과 열 위치를 기반으로 데이터 지정. 따라서 행과 열 값으로 정수가 입력됨
data = {'name':['홍길동', '이순신', '김아무개'],'Age' :[20,40,35]}
data_df = pd.DataFrame(data,index = ['one','two','three'])
# data_df를 reset_index()로 새로운 숫자형 인덱스
data_df = data_df.reset_index() # -> 0부터 새로 인덱싱
data_df = data_df.rename(columns = {'index':'old_index'}) # index -> old_index로 변환
# 위치 기반 인덱싱으로 데이터 접근
print(data_df.iloc[0,0]) # 홍길동
print(data_df.iloc[0,'name']) # 위치기반이기 때문에 오류 발생
# 명칭 기반 인덱싱으로 데이터 접근
print(data_df.loc[0,'name'] # 홍길동
print(data_df.loc['one','name'] # 홍길동
print(data_df.loc[0:1,'name']) # 0 홍길동 1 이순신
# 불린 인덱싱으로 데이터 접근
print(data_df[data_df['Age'] > 30) # 1 이순신 40 2 김아무개 35
- .iloc : 위치 기반 인덱싱으로 인덱스(혹은 숫자)로만 접근 가능
- .loc : 명칭 기반 인덱싱으로 인덱스의 이름과 컬럼의 이름으로 접근 가능
- 불린 인덱싱은 여러 조건을 사용할 때 &(and), |(or), ~ (not) 을 사용할 수 있다.
'Code > 머신러닝 in Python' 카테고리의 다른 글
| 판다스(Pandas) 결손 데이터 처리 및 apply (0) | 2019.08.08 |
|---|---|
| 판다스(Pandas) 정렬, Aggregation, groupby (0) | 2019.08.08 |
| 판다스(Pandas) 데이터프레임 활용 (0) | 2019.08.08 |
| 판다스(Pandas) 기초 + 타이타닉 데이터 (0) | 2019.08.08 |
| 넘파이(NumPy) 정렬 (0) | 2019.08.07 |
넘파이(NumPy) 정렬
1. sort() : 넘파이에서 지원해주는 np.sort() 와 ndarray.sort() 두 가지 방식으로 행렬을 정렬할 수 있다
org_array = np.array([3,1,9,5])
print("원본 : ", org_array) # [ 3 1 9 5]
sort_array1 = np.sort(org_array)
print(sort_array1) # [ 1 3 5 9]
print(org_array) # [ 3 1 9 5]
sort_array2 = org_array.sort()
print(sort_array2) # None
print(org_array) # [ 1 3 5 9]
- np.sort() : 원본 배열을 유지, 정렬된 배열을 반환하여 변수에 저장할 수 있다.
기본 오름차순으로, axis = 0 : 행, axis = 1 : 열 기준으로 정렬하게 된다.
- .sort() : 원본 배열을 정렬한 채로 반환함
기본 오름차순으로, 내림차순은 [::-1] 로 지정해주면 된다.
2. np.argsort() : 원본 행렬이 정렬되었을 때 기존 원본 행렬의 원소에 대한 인덱스를 필요로 할 때 사용
org_array = np.array([3,1,9,5]) # [ 3 1 9 5 ]
sort_indices = np.argsort(org_array) # [ 1 3 5 9 ]
print(sort_indices) # [ 1 0 3 2 ]
'Code > 머신러닝 in Python' 카테고리의 다른 글
| 판다스(Pandas) 데이터프레임 활용 (0) | 2019.08.08 |
|---|---|
| 판다스(Pandas) 기초 + 타이타닉 데이터 (0) | 2019.08.08 |
| 넘파이(NumPy) 인덱싱(indexing) (0) | 2019.08.07 |
| 넘파이(NumPy) ndarray (0) | 2019.08.07 |
| 넘파이(NumPy) 기초 + np.array() (0) | 2019.08.07 |
넘파이(NumPy) ndarray
앞 게시글에서는 넘파이의 기본과 np.array() 를 통해 생성하는 것을 학습하였다.
이번 게시글에서는 ndarray에서 지원하는 다양한 함수를 볼 것이다.
ndarray를 생성하는 numpy 함수들 사용할 때는 np.함수명으로 사용하다.
자료형이 명시 되지 않는 경우,
- 많은 numpy tutorial에서는 보통 float64가 될 것이라 하지만,
- numpy 구현체의 버전에 따라 일치하지 않는데,
- numpy 최신버전에서는 제시된 자료형을 담을 수 있는 최소 size의 자료형으로 정해진다고 document에서는 명시한다.
함수설명
| array | 입력 데이터를 ndarray로 변환. dtype 미 지정시, 자료형에서 추론 |
| asarray | 입력 데이터를 ndarray로 변환. 입력 데이터가 ndarray일 경우 그대로 표시 |
| arange | 내장range 함수와 유사하지만 리스트 대신 ndarray를 반환 |
| ones | 주어진 dtype과 shape을 가지는 배열 생성. 성분을 모두 1로 초기화 |
| ones_like | 주어진 배열과 동일한 shape과 dtype을 갖는 배열을 생성. 1로 초기화 |
| zero | ones와 같지만 0으로 채운다 |
| zeros_like | ones_like와 같지만 0dmfh codnsek |
| empty | 메모리를 할당하지만 초기화가 없음 |
| empty_like | 메모리를 할당하지만 초기화가 없음 |
| eye(N,M,k=0) | 1, 0의 값을 갖는 대각 NxM 대각 행렬 생성. k에 따라 대각이 이동 |
| identity | n x n 단위행렬 생성 |
| linspace | start, stop, size를 설정하면 ndarray로 생성 |
1. arange() : 파이썬의 표준 함수인 range() 와 유사한 기능으로 array를 range()로 표현하는 것
sequence_array = np.arage(10)
pirnt(sequence_array)
- 파이썬처럼 0부터 n-1까지의 숫자를 넣어주기 때문에 출력값은 [ 0 1 2 3 4 5 6 7 8 9] 으로 나오게 된다.
- 기본 함수는 arange([start,] stop[, step,], dtype=None) 로 default 값이 stop이기 때문에 stop = 10이 되어 자동으로 0부터 시작하게 된다.
2. zeros() : 함수 인자로 튜플 형태의 shape 값을 입력하면 모든 값을 0으로 채운 해당 shape를 가진 ndarray를 반환함
zero_array = np.zeros((3,2), dtype='int32')
print(zero_array)
print(zero_array.dtype)
- [[ 0 0 ] [ 0 0 ] [ 0 0 ]] -> 0으로 채워진 (3,2) ndarray 반환
- int32 -> np.zeros() 함수를 통해 dtype 으로 설정한 값으로 나오게 됨
3. ones() : 함수 이자로 튜플 형태의 shape 값을 입력하면 모든 값을 1로 채운 해당 shape를 가진 ndarray를 반환함
one_array = np.ones((3,2))
print(one_array)
print(one_array.dtype)
- [[ 1 1 ] [ 1 1 ] [ 1 1 ]] -> 1으로 채워진 (3,2) ndarray 반환
- float64 -> 디폴트 값인 float64 가 나오게 됨
4. reshape() : ndarray의 차원과 크기를 변경하는 함수, 변환을 원하는 크기를 함수 인자로 부여
array1 = np.arange(10) # [ 0 1 2 3 4 5 6 7 8 9]
array2 = array1.reshape(2,5) # [[0 1 2 3 4 ][5 6 7 8 9 ]]
array3 = array1.reshape(5,2) # [[0 1] [2 3] [4 5] [6 7] [8 9]]
- 여기서 지정된 사이즈로 변경이 가능하지만, (4,3) 처럼 맞지 않은 사이즈를 입력 시 오류를 발생시킴
* 인덱스에 있어서 -1 인 경우 ndarray와 호환되는 새로운 shape로 반환해줌
array1 = np.arange(10) # [ 0 1 2 3 4 5 6 7 8 9]
array2 = array1.reshape(-1,5) # [[0 1 2 3 4 ][5 6 7 8 9 ]]
array3 = array1.reshape(5,-1) # [[0 1] [2 3] [4 5] [6 7] [8 9]]
- -1 은 원본 ndarray가 어떤 차원의 형태이든 간에 결과는 2차원으로 나오게 되며, 여러개의 로우를 가지되 반드시 1개의 컬럼을 가진 ndarray로 변환됨을 보장한다.
'Code > 머신러닝 in Python' 카테고리의 다른 글
| 판다스(Pandas) 데이터프레임 활용 (0) | 2019.08.08 |
|---|---|
| 판다스(Pandas) 기초 + 타이타닉 데이터 (0) | 2019.08.08 |
| 넘파이(NumPy) 정렬 (0) | 2019.08.07 |
| 넘파이(NumPy) 인덱싱(indexing) (0) | 2019.08.07 |
| 넘파이(NumPy) 기초 + np.array() (0) | 2019.08.07 |
넘파이(NumPy) 기초 + np.array()
넘파이(NumPy) : Numerical Python
NumPy가 제공하는 기능은 다음과 같다:
- 빠르고 메모리 효율적인 벡터 연산과 세련된 브로드캐스팅 기능을 제공하는 다차원 배열인 ndarray
- 반복문을 작성할 필요 없이 전체 데이터 배열에 대해 빠른 연산을 제공하는 표준 수학 함수
- 배열 데이터를 디스크에 쓰거나 읽을 수 있는 도구와 메모리에 올려진 파일을 사용하는 도구
- 선형대수, 난수 발생기, 푸리에 변환 기능
- C, C++, 포트란으로 쓰여진 코드를 통합하는 도구
특히 마지막 기능으로 C API를 제공하여 저수준으로 씌여진 외부 라이브러리(c로 만들어진 openCV 등)를 쉽게 사용할 수 있도록 해준다.
NumPy는 고수준의 데이터분석 기능을 제공하지 않으나,
- 데이터를 array라는 연속된 메모리 공간에 저장하고,
- array라는 메모리 블럭 단위의 연산을 사용하도록 하여,
- 큰 규모의 데이터 연산을 빠르게 수행할 수 있도록 해줄 뿐 아니라,
- deep learning 이후 각광받고 있는 GPGPU를 통한 고속 연산 처리에 바로 적용할 수 있어,
- python 계열의 데이터분석, 데이터저장, 머신러닝, AI 도구들이 공통적으로 활용하여
- 데이터 객체인 ndarray와 이 객체의 메소드를 확장하여(상속하여) 구현하고 있다.
따라서, 고수준의 여러 python 계열의 분석 도구를 활용하려면, 그 기반이 되는 NumPy를 정확하게 이해하고 있어야 제대로된 분석이 가능하다.
고수준의 여러 python 계열의 분석 도구들이 주요하게 사용하는 기능은:
- 벡터 배열상에서 데이터 개조, 정제, 부분 집합, 필터링, 변형, 다른 종류 연산의 빠른 수행
- 정렬, 유일 원소 찾기, 집합연산 같은 일반적인 배열 처리 알고리즘
- 통계의 효과적인 표현과 데이터의 수집/요약
- 다른 종류의 데이터 묶음을 병합하고 엮기 위한 데이터 정렬과 데이터 간의 관계 조작
- if-elif-else를 포함하는 반복문 대신 사용할 수 있는 조건절을 표현할 수 있는 배열 표현
- 데이터 그룹 전체에 적용할 수 있는 수집, 변형, 함수 적용 같은 데이터 처리.
1. 넘파이 사용하기
import numpy as np
import를 통해서 넘파이 모듈을 추가할 수 있습니다.
as 를 통해 앞으로 소스에서 부를 때 별칭인 np로 호출할 것입니다.
2. array() -> 파이썬의 리스트와 같은, 배열
array1 = np.array([1,2,3])
print(type(array1)) # array1의 타입 출력
print(array1.shape) # array1의 형태(3,)
array2 = np.array([[1,2,3],[4,5,6]])
print(type(array2)) # array2의 타입 출력
print(array2.shape) # array2의 형태(2,3)
print('array1: : {.0}, array2 : {.2}'.format(array1.ndim, array2.ndim))
.type () : 변수에 대한 타입을 알 수 있는 함수로 결과값은 <class 'numpy.ndarray'>로 나오게 된다
.shape() : ndarray의 크기, 즉 행과 열의 수를 튜플 형태로 가지고 있으며, 배열의 차원을 알 수 있음
- array1 은 데이터 3개가 있는 1차원 배열이므로 (3,)가 나오게 된 것이고, array2 는 데이터가 1차원인 [1,2,3], [4,5,6] 이 두개인 2차원 배열이므로 (2,3)이 나오게 됩니다.
.ndim : 각 배열의 차원을 알 수 있는 함수
* 파이썬과 넘파이 비교
list1 = [1,2,3]
print(type(list1))
array1 = np.array([1,2,3])
print(type(array1))
print(array1.dtype)
- list1에 대한 type() 함수 -> <class 'list'>
- array1 에 대한 type() 함수 -> <class 'numpy.ndarray'>
* ndarray의 의미는 n-dimensional array(다차원 배열)의 약자이다.
즉, 파이썬의 리스트와 넘파이의 array는 다른 것으로 확인 할 수 있다. 넘파이를 사용하기 위해서는 파이썬의 데이터타입을 넘파이에서 처리하는 타입으로 변환이 필요하다.
- dtype : ndarray내의 데이터 타입을 확인 할 수 있는 함수로 결과는 int32 -> 모두 정수타입의 32비트임을 나타낸다. 정수와 실수가 섞여 있으면 가장 큰 데이터 타입을 따라가기 때문에 float64가 나오게 된다.
* 자료형, dtype은 ndarray가 특정 데이터를 메모리에서 해석하기 위해 필요한 정보를 담고 있는 특수한 객체다.
산술 데이터의 dtype은:
- float, int 같은 자료형의 이름과
- 하나의 원소가 차지하는 비트 수로 이루어진다.
- 예: float64 => 소수를 64bit 메모리 공간을 담는 data type.
종류Type Code설명
| int8, uint8 | i1, u1 | 부호가 있는 8비트(1바이트) 정수형과 부호가 없는 8비트 정수형 |
| int16, uint16 | i2, u2 | 부호가 있는 16비트 정수형과 부호가 없는 16비트 정수형 |
| int32, uint32 | i4, u4 | ~ |
| int64, uint64 | i8, u8 | ~ |
| float16 | f2 | 반정밀도 부동소수점 |
| float32 | f4 또는 f | 단정밀도 부동소수점, C언어의 float과 호환 |
| float64 | f8 또는 d | 배정밀도 부동소수점, C언어의 double형과 파이썬 float객체와 호환 |
| float128 | f16 또는 g | 확장 정밀도 부동소수점 |
| complex64/128/256, | c8, c16, c32 | 각각 2개의 32, 64, 128비트 부동소수점형을 가지는 복소수 |
| bool | ? | True, False를 저장하는 불리언형 |
| object | 0 | 파이썬 객체형 |
| string_ | S | 고정길이 문자열형(각 글자는 1바이트). 길이가 10인 문자열의 dtype = S10 |
| unicode_ | U | 고정 길이 유니코드형(OS에 따라 글자별 바이트수 다름) string_과 같은형식(ex) U10) |
array_int = np.array([1,2,3]) # 기본 배열 형태
array_float = array_int.astype('float64') # 타입 변환
print(array_float.dtype)
- .astype() : ndarray내 데이터 값의 타입 변경하는 함수
-> 정수로 들어간 array_int 는 float형태로 변환되어 출력값이 [1. , 2. , 3. ] 된다.
'Code > 머신러닝 in Python' 카테고리의 다른 글
| 판다스(Pandas) 데이터프레임 활용 (0) | 2019.08.08 |
|---|---|
| 판다스(Pandas) 기초 + 타이타닉 데이터 (0) | 2019.08.08 |
| 넘파이(NumPy) 정렬 (0) | 2019.08.07 |
| 넘파이(NumPy) 인덱싱(indexing) (0) | 2019.08.07 |
| 넘파이(NumPy) ndarray (0) | 2019.08.07 |