Numpy
1. Numpy 특징
- Numerical Python의 약자
- 고성능 과학 계산용 패키지로 강력한 N차원 배열 객체
- 범용적 데이터 처리에 사용 가능한 다차원 컨테이너
- 정교한 브로드캐스팅(broadcasting) 기능
- 파이썬의 자료형 list와 비슷하지만, 더 빠르고 메모리를 효율적으로 관리
- 반복문 없이 데이터 배열에 대한 처리를 지원하여 빠르고 편리
- 데이터 과학 도구에 대한 생태계의 핵심을 이루고 있음
2. 배열 생성
리스트로 배열 만들기
a1 = np.array([1, 2, 3, 4, 5])
print(a1)
print(type(a1))
print(a1.shape) # 5개의 element들이 있구나, 쉼표 뒤에 아무것도 없으면 1차원이라는 것
print(a1[0], a1[3])
a1[0] = 4
a1[1] = 5
a1[2] = 6 #수정도 가능
a1
[1 2 3 4 5]
<class 'numpy.ndarray'>
(5,)
1 4
array([4, 5, 6, 4, 5])
(5, )는 element들이 5개가 있고, 쉼표 뒤에 아무 것도 없으면 1차원이라는 의미
a2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a2)
print(a2.shape) # 3x3
print(a2[0, 0], a2[1,2])
[[1 2 3]
[4 5 6]
[7 8 9]]
(3, 3)
1 6
-> 2차원
a3 = np.array([ [[1, 2, 3], [4, 5, 6], [7, 8, 9]],
[ [1, 2, 3], [4, 5, 6], [7, 8, 9]],
[ [1, 2, 3], [4, 5, 6], [7, 8, 9]] ])
print(a3)
print(a3.shape)
[[[1 2 3]
[4 5 6]
[7 8 9]]
[[1 2 3]
[4 5 6]
[7 8 9]]
[[1 2 3]
[4 5 6]
[7 8 9]]]
(3, 3, 3)
-> 3차원
배열 생성 및 초기화
- zeros(): 모든 요소를 0으로 초기화
np.zeros(10)
>> array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
- ones(): 모든 요소를 1로 초기화
np.ones(10)
>> array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.ones((3,3))
>>
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
-> shape 모양 넣어서 2차원 형태도 가능
- full(): 모든 요소를 지정한 값으로 초기화
np.full((3,3),1.23)
>>
array([[1.23, 1.23, 1.23],
[1.23, 1.23, 1.23],
[1.23, 1.23, 1.23]])
-> 3x3에 1.23으로 채워진 배열
- eye(): 단위행렬(identity matrix) 생성
- 주대각선의 원소가 모두 1이고 나머지 원소는 모두 0인 정사각인 행렬
np.eye(3)
>>
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
-> 정사각 행렬이라 shape모양 지정하지 않고 n크기만 지정
np.eye(4)면
np.eye(4)
>>
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
- tri(): 삼각행렬 생성
np.tri(3) #삼각 모형이 1 나머지는 0 -> 수업 때 했던!!
>>
array([[1., 0., 0.],
[1., 1., 0.],
[1., 1., 1.]])
- empty(): 초기화 되지 않은 배열 생성
- 초기화가 없어서 배열 생성비용 저렴하고 빠름
- 초기화되지 않아서 기존 메모리 위치에 존재하는 값이 있음
np.empty(10) #기존의 값이 들어가 있는 것 -> 어떤 값이 올지 모름
>> array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
- _like(): 지정된 배열과 shape이 같은 행렬 생성
- np.zeros_like()
- np.ones_like()
- np.full_like()
- np.empty_like()
print(a1)
>> [4 5 6 4 5]
np.zeros_like(a1) #a1 과 같은 shape의 배열에 0을 채워줘
>> array([0, 0, 0, 0, 0])
print(a2)
np.ones_like(a2)
>>
[[1 2 3]
[4 5 6]
[7 8 9]]
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
print(a3)
np.full_like(a3, 10)
>>
[[[1 2 3]
[4 5 6]
[7 8 9]]
[[1 2 3]
[4 5 6]
[7 8 9]]
[[1 2 3]
[4 5 6]
[7 8 9]]]
array([[[10, 10, 10],
[10, 10, 10],
[10, 10, 10]],
[[10, 10, 10],
[10, 10, 10],
[10, 10, 10]],
[[10, 10, 10],
[10, 10, 10],
[10, 10, 10]]])
생성한 값으로 배열 생성
- arrange(): 정수 범위로 배열 생성
np.arange(0, 30, 2) #파이썬 range함수 -> array만들어지는 것임
>> array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28])
- linespace(): 범위 내에서 균등 간격의 배열 새성
np.linspace(0, 1, 5) # 0~1 균등하게 5로 나눠
>> array([0. , 0.25, 0.5 , 0.75, 1. ])
- logspace(): 범위 내에서 균등간격으로 로그 스케일로 배열 생성
np.logspace(0.1, 1, 20)
>>
array([ 1.25892541, 1.40400425, 1.565802 , 1.74624535, 1.94748304,
2.1719114 , 2.42220294, 2.70133812, 3.0126409 , 3.35981829,
3.74700446, 4.17881006, 4.66037703, 5.19743987, 5.79639395,
6.46437163, 7.2093272 , 8.04013161, 8.9666781 , 10. ])
(참고)
랜덤 값으로 배열 생성
함수 | 설명 |
seed | 난수 발생을 위한 시드(seed) 지정 |
permutation | 순서를 임의로 바꾸거나 임의의 순열 반환 |
shuffle | 리스트나 배열의 순서를 뒤섞음 |
random | 랜덤한 수의 배열 생성 |
rand | 균등분포에서 표본 추출 |
randint | 주어진 최소/최대 범위의 난수 추출 |
randn | 표준편차가 1, 평균값 0인 정규분포의 표본 추출 |
binomial | 이항분포에서 표본 추출 |
normal | 정규분포(가우시안)에서 표본 추출 |
beta | 베타분포에서 표본 추출 |
chisquare | 카이제곱분포에서 표본 추출 |
gamma | 감마분포에서 표본 추출 |
uniform | 균등(0,1)분포에서 표본 추출 |
정규 분포(normal distribution)
- 가우시안 정규 분포 (Gaussian normal distribution) 라고도 한다
- 자연 현상에서 나타나는 숫자를 확률 모형으로 나타낼 때 사용한다. 즉, 수집된 자료의 분포를 근사하는 데에 자주 사용
- random.random(): 랜덤한 수의 배열 생성
np.random.random((3,3)) #랜덤 실수, shape만 정해주면 됨
>>
array([[0.7271253 , 0.09892615, 0.75553 ],
[0.67868707, 0.84309241, 0.99616723],
[0.51479988, 0.01097926, 0.5606317 ]])
np.random.random((3,3,3))
>>
array([[[0.93534065, 0.85012904, 0.31395282],
[0.09425532, 0.76641332, 0.66416117],
[0.72384467, 0.9215196 , 0.01374308]],
[[0.26621864, 0.85294657, 0.78039905],
[0.87721404, 0.73255218, 0.76681427],
[0.97882685, 0.83218069, 0.15288432]],
[[0.09340093, 0.72066878, 0.41538735],
[0.40401489, 0.0606457 , 0.56898089],
[0.08620396, 0.11458599, 0.29468311]]])
- random.randint(): 일정 구간의 랜덤 정수의 배열 생성
np.random.randint(0, 10, (3, 3)) #0~10까지 중에서, shape 은 3x3
>>
array([[1, 6, 7],
[0, 0, 3],
[8, 8, 8]])
- random.normal(): 정규분포(normal distribution)를 고려한 랜덤한 수의 배열 생성
- 평균=0, 표준편차=1, 3 x 3 배열
np.random.normal(0, 1, size = (3,3))
>>
array([[ 0.88083474, -0.85664921, 0.27137419],
[-0.95776877, -0.30146982, 0.3882944 ],
[-0.21252238, -1.11429329, -0.95773857]])
- random.rand(): 균등분포(uniform distribution)를 고려한 랜덤한 수의 배열 생성
np.random.rand(3,3)
>>
array([[0.57739454, 0.17067861, 0.0566638 ],
[0.1196071 , 0.97340677, 0.04527773],
[0.81516978, 0.35257297, 0.4503461 ]])
- random.randn(): 표준 정규 분포(standard normal distribution)를 고려한 랜덤한 수의 배열 생성
np.random.randn(3,3)
>>
array([[ 0.13060454, -1.05810324, -0.61093906],
[ 1.51612038, 0.46332077, 0.20927219],
[ 0.18543729, -0.2137167 , 0.42097537]])
표준 데이터 타입
데이터 타입 | 설명 |
bool_ | 바이트로 저장된 불리언(Boolean)으로 True 또는 False 값을 가짐 |
int_ | 기본 정수(Integer) 타입 |
inte | C 언어에서 사용되는 int 와 동일 (일반적으로 int32 또는 Int64) |
intp | 인덱싱에 사용되는 정수(C 언어에서 ssize_+ 와 동일; 일반적으로 int32 또는 int64) |
int8 | 바이트(Byte) (-128 ~ 127) |
int16 | 정수 (-32768~ 32767) |
int32 | 부호 없는 정수(0~ 18446744073709551615) |
int64 | 정수(9223:72086854775803 ~ 9223372036854775807 |
uint8 | 부호 없는 정수(0~ 255) |
uint16 | 부호 없는 정수 (0~ 65535) |
uint32 | 부호 없는 정수 (0~ 4294967295) |
uint64 | 부호 없는 정수(0~ 18446744073709551615) |
float16 | 반정밀 부동 소수점(Half precision float): 부호 비트, 5비트 지수, 10비트 가수 |
float32 | 단정밀 부동 소수점(Single precision float): 부호 비트, 8비트 지수, 23비트 가수 |
float64 | 배정밀 부동 소수점(Double precision floal): 부호 비트, 11비트 지수, 52비트 가수 |
float_ | float64 를 줄여서 표현 |
complex64 | 복소수(Complex number), 두 개의 32비트 부동 소수점으로 표현 |
complex128 | 복소수(Complex number), 두 개의 64비트 부동 소수점으로 표현 |
complex_ | complex128를 줄여서 표현 |
np.zeros(20, dtype = int) #int값으로 표현
>> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
np.ones((3,3), dtype = bool) # 1은 true 의미
>>
array([[ True, True, True],
[ True, True, True],
[ True, True, True]])
np.zeros((3,3), dtype = bool)
>>
array([[False, False, False],
[False, False, False],
[False, False, False]])
np.full((3,3), 1.0, dtype = float)
>>
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
날짜 / 시간 배열 생성
date = np.array('2020-01-01', dtype = np.datetime64)
date
>> array('2020-01-01', dtype='datetime64[D]')
date + np.arange(12)
>>
array(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',
'2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08',
'2020-01-09', '2020-01-10', '2020-01-11', '2020-01-12'],
dtype='datetime64[D]')
-> 날짜를 계산 가능한 형태로
datetime = np.datetime64('2023-02-01 12:00')
datetime
>> numpy.datetime64('2023-02-01T12:00')
datetime = np.datetime64('2022-06-01 12:00:12.45', 'ns')
datetime
>> numpy.datetime64('2022-06-01T12:00:12.450000000')
참고 영상
'STUDY' 카테고리의 다른 글
[DACON] Data Leakage (0) | 2023.04.03 |
---|---|
[A/B Testing] Overview of A/B Testing (0) | 2023.03.21 |
[Python] Numpy (배열 연산 / 배열 입출력) (0) | 2023.02.12 |
[Python] Numpy (배열 조회 / 배열 변환) (0) | 2023.02.12 |
[Seaborn Tutorial] An introduction to seaborn (0) | 2023.02.08 |